生活随笔
收集整理的這篇文章主要介紹了
                                
boost::shared_mutex
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                             ?前一篇介紹的條件變量可以進行進程間通信,用來實現生產者/消費者模型。今天介紹的共享互斥量用來實現緩沖區讀寫模型,與生產者/消費者模型不同的地方是,消費者消費產品后,被消費的產品就不存在了,所以消費者線程也要互斥運行;而緩沖區讀取線程讀取數據后不刪除數據,多個線程可以并行讀取。這時使用條件變量也不合適了,就要使用共享互斥變量了。
 
 ??????? 共享互斥量,顧名思義,既共享,也互斥,讀線程之間共享讀取數據,使用shared_lock類鎖定shared_mutex變量;寫線程之間需要獨占緩沖區,必須互斥運行,使用unique_lock類鎖定shared_mutex變量。這與互斥變量mutex的使用方法不一樣,mutex類內部提供了一種lock_guard類即scope_lock類,因此可以用
 
   [cpp]?view plaincopy   print?  
 mutex::scope_lock?lock(mu);?? 
 
 這樣的形式來鎖定互斥量,而share_mutex類沒有提供這種內部定義的lock_guard類,所以需要直接使用lock_guard對象,語法如下代碼:
 
   [cpp]?view plaincopy   print?  
 shared_mutex?rw_mu;?? ?? unique_lock<shared_mutex>?ul(rw_mu);?? shared_lock<shared_mutex>?sl(rw_mu);?? 
 
 
 下面是《指南》上的例子:
 ?
 
   [cpp]?view plaincopy   print?  
 private:?? ????????int?m_x;?? ????????shared_mutex?rw_mu;?? ?? public:?? ????????rw_data():m_x(0){}?? ?? ????????void?write()?? ????????{?? ????????????unique_lock<shared_mutex>?ul(rw_mu);?? ????????????++m_x;?? ????????}?? ?? ????????void?read(int&?x)?? ????????{?? ????????????shared_lock<shared_mutex>?sl(rw_mu);?? ????????????x?=?m_x;?? ????????}?? };?? ?? void?writer(rw_data&?d)?? {?? ????for(int?i?=?0;?i?<?20;?++i)?? ????{?? ????????this_thread::sleep(posix_time::millisec(10));?? ????????d.write();?? ????}?? }?? ?? void?reader(rw_data&?d,?mutex&?io_mu)?? {?? ????int?x;?? ?? ????for(int?i?=?0;?i?<?10;?++i)?? ????{?? ????????this_thread::sleep(posix_time::millisec(5));?? ????????d.read(x);?? ????????mutex::scoped_lock?lock(io_mu);?? ????????std::cout?<<?"reader:"?<<?x?<<?std::endl;?? ????}?? }?? ?? int?main()?? {?? ???rw_data?d;?? ???thread_group?pool;?? ???mutex?io_mu;?? ????? ???pool.create_thread(bind(reader,ref(d),?ref(io_mu)));?? ???pool.create_thread(bind(reader,ref(d),?ref(io_mu)));?? ???pool.create_thread(bind(reader,ref(d),?ref(io_mu)));?? ???pool.create_thread(bind(reader,ref(d),?ref(io_mu)));?? ???pool.create_thread(bind(writer,ref(d)));?? ???pool.create_thread(bind(writer,ref(d)));?? ?? ???pool.join_all();?? ?? ???return?0;?? } ?
                            總結
                            
                                以上是生活随笔為你收集整理的boost::shared_mutex的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。