天天看點

C++ 11 并發: 正确 的使用條件變量-condition_variable

  • 1. 标準執行個體

http://en.cppreference.com/w/cpp/thread/condition_variable

在cppreference提供的對 cv的例子,condition_variable和mutex都是全局變量。但是我們的程式不可能到處使用全局變量。如果把condition_variable和mutex的定義放到main函數中進去,作為局部變量,并且循環幾次,會發現第一次同步OK,後面的就沒有那麼好的運氣了。

是以對于局部變量中如何正确的使用condition_variable,cppreference那個執行個體是不夠的,需要配合 atomic<bool>等。

  • 2.改進

可以把下面的代碼放到任意函數中,都可以正常的進行同步,如果沒有flag,在gcc4.8下面,第一次成功,後面就失敗了,接收不到通知 std::mutex ml;

std::condition_variable cv;

std::atomic<bool> flag(false);

run_job([&cv,&flag]{

//執行異步代碼

flag.store(true);

cv.notify_one();

});

//同步等待異步代碼run_job的執行完成的通知

std::unique_lock<std::mutex> lk(ml);

cv.wait(lk, [&flag]{ return flag.load();});

繼續閱讀