Boost.shared_lock解决读者和写者问题

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

猜你喜欢

转载自blog.csdn.net/knightonhourse/article/details/80212937