boost庫中thread多線程詳解2——mutex與lock


1. mutex對象類

mutex類主要有兩種:獨占式與共享式的互斥量。
▲ 獨占式互斥量:
mutex: 獨占式的互斥量,是最簡單最常用的一種互斥量類型
try_mutex: 它是mutex的同義詞,為了與兼容以前的版本而提供
timed_mutex: 它也是獨占式的互斥量,但提供超時鎖定功能
▲ 遞歸式互斥量:
recursive_mutex: 遞歸式互斥量,可以多次鎖定,相應地也要多次解鎖
recursive_try_mutex: 它是recursive_mutex 的同義詞,為了與兼容以前的版本而提供
recursive_timed_mutex: 它也是遞歸式互斥量,基本功能同recursive_mutex, 但提供超時鎖定功能
▲ 共享式互斥量:
shared_mutex: multiple-reader/single-writer 型的共享互斥量(又稱讀寫鎖)。
其中mutex有lock和unlock方法,shared_mutex除了提供lock和unlock方法外,還有shared_lock和shared_unlock方法。

2. lock模板類

▲ 獨占鎖:
boost::unique_lock<T>,其中T可以mutex中的任意一種。
  如果T為mutex,那么boost::unique_lock<boost::mutex>,構造與析構時則分別自動調用lock和unlock方法。
  如果T為shared_mutex,那么boost::unique_lock<boost::shared_mutex>,構造與析構時則分別調用shared_mutex的shared_lock和shared_unlock方法。
注意:scoped_lock也是獨占鎖,其源代碼中定義如下;
  typedef unique_lock<mutex> scoped_lock;
  typedef unique_lock<timed_mutex> scoped_timed_lock;
▲ 共享鎖:
boost::shared_lock<T>,其中的T只能是shared_mutex類。
當然還有其他一些鎖:lock_guard, upgrade_lock等。

3. 讀寫鎖的實現

[cpp]  view plain copy print ?
 
  1. typedef boost::shared_lock<boost::shared_mutex> readLock;  
  2. typedef boost::unique_lock<boost::shared_mutex> writeLock;  
  3. boost::shared_mutex rwmutex;  
  4.   
  5. void readOnly()  
  6. {  
  7.   readLock rdlock(rwmutex);  
  8.   // do something  
  9. }  
  10.   
  11. void writeOnly()  
  12. {  
  13.   writeLock wtlock(rwmutex);  
  14.   // do something  
  15. }  

對同一個rwmutex,線程可以同時有多個readLock,這些readLock會阻塞任意一個企圖獲得writeLock的線程,直到所有的readLock對象都析構。如果writeLock首先獲得了rwmutex,那么它會阻塞任意一個企圖在rwmutex上獲得readLock或者writeLock的線程。

4. boost::lock_guard<>和boost::unique_lock<>的區別

[cpp]  view plain copy print ?
 
  1. boost::mutex m;  
  2. void foo( )  
  3. {  
  4.   boost::lock_guard<boost::mutex> lk(m);  
  5.   process(data);  
  6. };  
  7.   
  8. // lock_guard只能像上面這樣使用,而unique_lock允許設置超時,推遲鎖定lock以及在對象銷毀之前unlock。  
  9. {  
  10.   boost::unique_lock<boost::mutex> lk( m );  
  11.   process( data );  
  12.   lk.unlock( );  
  13.   // do other thing  
  14. };  
  15.   
  16. // 設置鎖超時  
  17. {  
  18.   boost::unique_lock<boost::timed_mutex> lk(m, std::chrono::milliseconds(3)); // 超時3秒  
  19.   if(lk)  
  20.     process( data );  
  21. };  

 

5. 簡單示例

[cpp]  view plain copy print ?
 
    1. namespace  
    2. {  
    3.     boost::mutex mutex;  
    4.     boost::shared_mutex shared_mutex;  
    5.   
    6.     void wait(int seconds)  
    7.     {  
    8.         boost::this_thread::sleep(boost::posix_time::seconds(seconds));  
    9.     }  
    10.   
    11.     void threadfun1()  
    12.     {  
    13.         for (int i = 0; i < 5; ++i)  
    14.         {  
    15.             wait(1);  
    16.             mutex.lock();  
    17.             PRINT_DEBUG(i);  
    18.             mutex.unlock();  
    19.         }  
    20.     }  
    21.   
    22.     void threadfun2()  
    23.     {  
    24.         for (int i = 0; i < 5; ++i)  
    25.         {  
    26.             wait(1);  
    27.             boost::lock_guard<boost::mutex> lock(mutex);  
    28.             PRINT_DEBUG(i);  
    29.         }  
    30.     }  
    31.       
    32.     void threadfun3()  
    33.     {  
    34.         for (int i = 0; i < 5; ++i)  
    35.         {  
    36.             wait(1);  
    37.             // unique_lock<boost::mutex> = scoped_lock  
    38.             boost::unique_lock<boost::mutex> lock(mutex);  
    39.             std::cout << lock.owns_lock() << std::endl;  
    40.             PRINT_DEBUG(i);  
    41.         }  
    42.     }  
    43. }  
    44.   
    45. // 1. mutex例子  
    46. void test_thread_syn1()  
    47. {  
    48.     boost::thread t1(&threadfun1);  
    49.     boost::thread t2(&threadfun1);  
    50.   
    51.     t1.join();  
    52.     t2.join();  
    53. }  
    54.   
    55. //  2. lock_guard例子  
    56. void test_thread_syn2()  
    57. {  
    58.     boost::thread t1(&threadfun2);  
    59.     boost::thread t2(&threadfun2);  
    60.   
    61.     t1.join();  
    62.     t2.join();  
    63. }  
    64.   
    65. // 3. scoped_lock例子  
    66. void test_thread_syn3()  
    67. {  
    68.     boost::thread t1(&threadfun3);  
    69.     boost::thread t2(&threadfun3);  
    70.   
    71.     t1.join();  
    72.     t2.join();  
    73. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM