boost::shared_mutex

 前一篇介绍的条件变量可以进行进程间通信,用来实现生产者/消费者模型。今天介绍的共享互斥量用来实现缓冲区读写模型,与生产者/消费者模型不同的地方是,消费者消费产品后,被消费的产品就不存在了,所以消费者线程也要互斥运行;而缓冲区读取线程读取数据后不删除数据,多个线程可以并行读取。这时使用条件变量也不合适了,就要使用共享互斥变量了。

        共享互斥量,顾名思义,既共享,也互斥,读线程之间共享读取数据,使用shared_lock类锁定shared_mutex变量;写线程之间需要独占缓冲区,必须互斥运行,使用unique_lock类锁定shared_mutex变量。这与互斥变量mutex的使用方法不一样,mutex类内部提供了一种lock_guard类即scope_lock类,因此可以用

[cpp]  view plain  copy
 print ?
  1. mutex::scope_lock lock(mu);  

这样的形式来锁定互斥量,而share_mutex类没有提供这种内部定义的lock_guard类,所以需要直接使用lock_guard对象,语法如下代码:

[cpp]  view plain  copy
 print ?
  1. shared_mutex rw_mu;  
  2.   
  3. unique_lock<shared_mutex> ul(rw_mu);  
  4. shared_lock<shared_mutex> sl(rw_mu);  


下面是《指南》上的例子:
 

[cpp]  view plain  copy
 print ?
  1. private:  
  2.         int m_x;  
  3.         shared_mutex rw_mu;  
  4.   
  5. public:  
  6.         rw_data():m_x(0){}  
  7.   
  8.         void write()  
  9.         {  
  10.             unique_lock<shared_mutex> ul(rw_mu);  
  11.             ++m_x;  
  12.         }  
  13.   
  14.         void read(int& x)  
  15.         {  
  16.             shared_lock<shared_mutex> sl(rw_mu);  
  17.             x = m_x;  
  18.         }  
  19. };  
  20.   
  21. void writer(rw_data& d)  
  22. {  
  23.     for(int i = 0; i < 20; ++i)  
  24.     {  
  25.         this_thread::sleep(posix_time::millisec(10));  
  26.         d.write();  
  27.     }  
  28. }  
  29.   
  30. void reader(rw_data& d, mutex& io_mu)  
  31. {  
  32.     int x;  
  33.   
  34.     for(int i = 0; i < 10; ++i)  
  35.     {  
  36.         this_thread::sleep(posix_time::millisec(5));  
  37.         d.read(x);  
  38.         mutex::scoped_lock lock(io_mu);  
  39.         std::cout << "reader:" << x << std::endl;  
  40.     }  
  41. }  
  42.   
  43. int main()  
  44. {  
  45.    rw_data d;  
  46.    thread_group pool;  
  47.    mutex io_mu;  
  48.      
  49.    pool.create_thread(bind(reader,ref(d), ref(io_mu)));  
  50.    pool.create_thread(bind(reader,ref(d), ref(io_mu)));  
  51.    pool.create_thread(bind(reader,ref(d), ref(io_mu)));  
  52.    pool.create_thread(bind(reader,ref(d), ref(io_mu)));  
  53.    pool.create_thread(bind(writer,ref(d)));  
  54.    pool.create_thread(bind(writer,ref(d)));  
  55.   
  56.    pool.join_all();  
  57.   
  58.    return 0;  
  59. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值