boost::shared_lock 的类提供了非独占锁,这个类必须和 boost::shared_mutex 型的互斥量一起使用。boost::shared_mutex它允许线程获取多个共享所有权和一个专享所有权,它比mutex的代价高很多。通过lock_shared()或try_lock_shared()获取共享所有权,使用unlock_shared()来释放共享所有权。
读锁定时shared_lock<shared_mutex>,写锁定时使用unique_lock<shared_mutex>。
#include <boost/thread.hpp> #include <boost/thread/mutex.hpp> #include <iostream> class rw_data { private: int m_x; boost::shared_mutex rw_mu; public: rw_data():m_x(0){} void write() { boost::unique_lock<boost::shared_mutex> ul(rw_mu); ++m_x; } void read(int *x) { boost::shared_lock<boost::shared_mutex> sl(rw_mu); *x = m_x; } }; void writer(rw_data &d) { for (int i = 0; i < 20; ++i) { boost::this_thread::sleep(boost::posix_time::seconds(10)); d.write(); cout << "writer:" << i << endl; } } void reader(rw_data &d) { int x; for (int i = 0; i < 10; ++i) { boost::this_thread::sleep(boost::posix_time::seconds(5)); d.read(&x); cout << "reader:" << x << endl; } } void main() { rw_data d; boost::thread_group pool; pool.create_thread(boost::bind(reader, boost::ref(d))); pool.create_thread(boost::bind(reader, boost::ref(d))); pool.create_thread(boost::bind(reader, boost::ref(d))); pool.create_thread(boost::bind(reader, boost::ref(d))); pool.create_thread(boost::bind(writer, boost::ref(d))); pool.create_thread(boost::bind(writer, boost::ref(d))); pool.join_all(); }