首页 > 代码库 > Boost条件变量condition_variable_any
Boost条件变量condition_variable_any
Boost条件变量可以用来实现线程同步,它必须与互斥量配合使用。使用条件变量实现生产者消费者的简单例子如下,需要注意的是cond_put.wait(lock)是在等待条件满足。如果条件不满足,则释放锁,将线程置为waiting状态,继续等待;如果条件满足,则重新获取锁,然后结束wait,继续向下执行。
#include "stdafx.h" #include <stack> #include <boost/bind/bind.hpp> #include <boost/thread.hpp> #include <boost/thread/lock_factories.hpp> using namespace std; class Buffer { private: boost::mutex mu; boost::condition_variable_any cond_put; boost::condition_variable_any cond_get; int un_read, capacity; std::stack<int> m_stk; bool isFull() { return un_read == capacity; } bool isEmpty() { return un_read == 0; } public: Buffer(size_t n):un_read(0), capacity(n) {} void put(int x) { { auto lock = make_unique_lock(mu); for (; isFull(); ) { cout << "Full waiting"<<endl; cond_put.wait(lock); } m_stk.push(x); ++un_read; } cond_get.notify_one(); } void get(int *x) { { auto lock = make_unique_lock(mu); for (; isEmpty(); ) { cout<<"Empty waiting..."<<endl; cond_get.wait(lock); } --un_read; *x = m_stk.top(); m_stk.pop(); } cond_put.notify_one; } }; Buffer buf(5); void Producer(int n) { for (int i=0; i<n; i++) { cout<< "Putting "<<i<<endl; buf.put(i); } } void Consumer(int n) { int x; for (int i=0; i<n; i++) { buf.get(&x); cout<<"Getting "<<x<<endl; } } int main() { boost::thread_group tg; tg.create_thread(bind(Producer, 20)); tg.create_thread(bind(Consumer, 10)); tg.create_thread(bind(Consumer, 10)); tg.join_all(); return 0; }
Boost条件变量condition_variable_any
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。