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