<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

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

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    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 plaincopyprint?  
    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 plaincopyprint?  
    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 plaincopyprint?  
      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. }  
    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全