C++多線程-chap2多線程通信和同步4

這裏,只是記錄自己的學習筆記。

順便和大家分享多線程的基礎知識。然後從入門到實戰。有代碼。

知識點來源:

https://edu.51cto.com/course/26869.html


 

C++11 支持的RAII管理互斥資源 lock_guard

  • C++11 實現嚴格基於作用域的互斥體所有權包裝器
  • adopt_lock c++11 類型爲 adopt_lock_t,假設調用方已擁有互斥的所有權
  • 通過{} 控制鎖的臨界區

 

 1 #include <iostream>
 2 #include <thread>
 3 #include <string>
 4 #include <mutex>
 5 
 6 using namespace std;
 7 
 8 
 9 
10 static mutex gmutex;
11 void TestLockGuard(int i)
12 {
13     gmutex.lock();
14     {
15         //調用這個會報錯。因爲已經鎖住了。。。需要調用lock_guard的一個重載構造函數。。
16         //lock_guard<mutex> lock(gmutex);
17 
18         //已經擁有鎖,不lock
19         lock_guard<mutex> lock(gmutex, adopt_lock);
20         //結束釋放鎖
21     }
22 
23     {
24         //鎖的作用域被限定在了 {} 範圍內了 。出去之後就自動解鎖了 
25         lock_guard<mutex> lock(gmutex);
26         cout << "begin thread " << i << endl;
27     }
28     for (;;) {
29         {
30             lock_guard<mutex> lock(gmutex);
31             cout << "In " << i << endl;
32         }
33         this_thread::sleep_for(500ms);
34     }
35 }
36 
37 int main() {
38     for (int i = 0; i < 3; i++) {
39         thread th(TestLockGuard, i + 1);
40         th.detach();
41     }
42 
43 
44     getchar();
45     return 0;
46 }

 

 

看看 LockGuard的方法實現

 1         // CLASS TEMPLATE lock_guard
 2 template<class _Mutex>
 3     class lock_guard
 4     {    // class with destructor that unlocks a mutex
 5 public:
 6     using mutex_type = _Mutex;
 7 
 8     explicit lock_guard(_Mutex& _Mtx)
 9         : _MyMutex(_Mtx)
10         {    // construct and lock
11         _MyMutex.lock();
12         }
13 
14     lock_guard(_Mutex& _Mtx, adopt_lock_t)
15         : _MyMutex(_Mtx)
16         {    // construct but don't lock
17         }
18 
19     ~lock_guard() noexcept
20         {    // unlock
21         _MyMutex.unlock();
22         }
23 
24     lock_guard(const lock_guard&) = delete;
25     lock_guard& operator=(const lock_guard&) = delete;
26 private:
27     _Mutex& _MyMutex;
28     };

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章