stdthread(6)并发mutex
生活随笔
收集整理的這篇文章主要介紹了
stdthread(6)并发mutex
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. mutex是用來保證線程同步的,防止不同的線程同時操作同一個共享數據
1.1 C++11四種互斥量
-
std::mutex,最常用,普遍的互斥量(默認屬性),獨占式互斥量
-
std::recursive_mutex ,允許同一線程使用recursive_mutext多次加鎖,然后使用相同次數的解鎖操作解鎖(mutex多次加鎖會造成死鎖)
-
std::timed_mutex,允許超時的獨占式互斥量,在mutex上增加了時間的屬性。增加了兩個成員函數try_lock_for(),try_lock_until(),分別接收一個時間范圍,再給定的時間內如果互斥量被鎖主了,線程阻塞,超過時間,返回false。
-
std::recursive_timed_mutex,允許超時的遞歸式互斥量,增加遞歸和時間屬性
1.2 函數
- lock(),互斥量加鎖,如果互斥量已被加鎖,線程阻塞
- bool try_lock(),嘗試加鎖,如果互斥量未被加鎖,則執行加鎖操作,返回true;如果互斥量已被加鎖,返回false,線程不阻塞。
- void unlock(),解鎖互斥量
2. 例子
int cnt = 20;std::mutex m;void t1(){while (cnt > 0){ m.lock();if (cnt > 0){//sleep(1);--cnt;std::cout << "t1 " << cnt << std::endl;}m.unlock(); }}void t2(){while (cnt > 0){m.lock();if (cnt > 0){--cnt;std::cout << "t2 " << cnt << std::endl;}m.unlock();}}int test(void){std::thread th1(t1);std::thread th2(t2);th1.join(); //等待t1退出th2.join(); //等待t2退出std::cout << "test" << std::endl;return 0;}輸出結果會有多種,但cnt是依次遞減的
t1 19 t1 18 t1 17 t1 16 t1 15 t1 14 t1 13 t1 12 t1 11 t1 10 t1 9 t1 8 t1 7 t2 6 t2 5 t2 4 t2 3 t2 2 t2 1 t2 0 mutex test或t1 19 t1 18 t1 17 t1 16 t1 15 t1 14 t1 13 t1 12 t1 11 t1 10 t1 9 t1 8 t1 7 t1 6 t1 5 t1 4 t1 3 t1 2 t1 1 t1 0 mutex test總結
以上是生活随笔為你收集整理的stdthread(6)并发mutex的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stdthread(5)并发atomic
- 下一篇: stdthread(6)并发lockGu