- 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();});