首页 > 代码库 > C++ 11 并发: 正确 的使用条件变量-condition_variable
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();});
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();});
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。