亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++多線程中的鎖和條件變量使用教程

2020-05-23 13:25:14
字體:
來源:轉載
供稿:網友

在做多線程編程時,有兩個場景我們都會遇到:

  1. 多線程訪問共享資源,需要用到鎖;
  2. 多線程間的狀態同步,這個可用的機制很多,條件變量是廣泛使用的一種。

今天我用一個簡單的例子來給大家介紹下鎖和條件變量的使用。

代碼使用C++11

示例代碼

#include <iostream>#include <mutex>#include <thread>#include <condition_variable>std::mutex       g_mutex;   // 用到的全局鎖std::condition_variable g_cond;   // 用到的條件變量int g_i    = 0;bool g_running = true;void ThreadFunc(int n) {       // 線程執行函數 for (int i = 0; i < n; ++i) {  {   std::lock_guard<std::mutex> lock(g_mutex);   // 加鎖,離開{}作用域后鎖釋放   ++g_i;   std::cout << "plus g_i by func thread " << std::this_thread::get_id() << std::endl;  } } std::unique_lock<std::mutex> lock(g_mutex);    // 加鎖 while (g_running) {  std::cout << "wait for exit" << std::endl;  g_cond.wait(lock);                // wait調用后,會先釋放鎖,之后進入等待狀態;當其它進程調用通知激活后,會再次加鎖 } std::cout << "func thread exit" << std::endl;}int main() { int     n = 100; std::thread t1(ThreadFunc, n);    // 創建t1線程(func thread),t1會執行`ThreadFunc`中的指令 for (int i = 0; i < n; ++i) {  {   std::lock_guard<std::mutex> lock(g_mutex);   ++g_i;   std::cout << "plus g_i by main thread " << std::this_thread::get_id() << std::endl;  } } {  std::lock_guard<std::mutex> lock(g_mutex);  g_running = false;  g_cond.notify_one();   // 通知其它線程 } t1.join();     // 等待線程t1結束 std::cout << "g_i = " << g_i << std::endl;}

程序運行后,關鍵輸出如下:

plus g_i by main thread 139921025066816plus g_i by main thread 139921025066816plus g_i by func thread 139921006847744plus g_i by func thread 139921006847744plus g_i by func thread 139921006847744plus g_i by func thread 139921006847744plus g_i by func thread 139921006847744wait for exit               // func thread等待main thread發來的退出信號plus g_i by main thread 139921025066816plus g_i by main thread 139921025066816plus g_i by main thread 139921025066816plus g_i by main thread 139921025066816plus g_i by main thread 139921025066816plus g_i by main thread 139921025066816plus g_i by main thread 139921025066816plus g_i by main thread 139921025066816plus g_i by main thread 139921025066816plus g_i by main thread 139921025066816func thread exitg_i = 200     // 鎖機制保證了g_i的正確

可以看到:

std::this_thread::get_id()g_i

加鎖方法介紹

加鎖相關的代碼為:

{ std::lock_guard<std::mutex> lock(g_mutex); ......}

要點為:

  • 首先,這在一個局部作用域內, std::lock_guard 在構造時,會調用 g_mutex->lock() 方法;
  • 局部作用域代碼結束后, std:;lock_guard 的析構函數會被調用,函數中會調用 g_mutex->unlock() 方法。

這樣就實現了加鎖和解鎖的過程,為什么不直接調用加鎖解鎖方法呢?

我想,這是因為如果加鎖和解鎖中間的代碼出現了問題,導致線程函數異常退出,那么這個鎖就一直無法得到釋放,其它線程處理的不好的話,就會造成死鎖了。

條件變量使用介紹

  • 當線程調用 g_cond.wait(lock) 前要先手動調用 lock->lock() ,這里是通過 std::unique_lock 的構造方法實現的;
  • 當線程調用 g_cond.wait(lock) 進入等待后,會調用 lock->unlock() 方法,所以這也是前面構造lock時使用了 std::unique_lock ;
  • 通知使用的 g_cond.notify_one() ,這個可以通知一個線程,另外還有 g_cond.notify_all() 用于通知所有線程;
  • 線程收到通知的代碼放在一個while循環中,這是為了防止APUE中提到的虛假通知。

結束語

以上所述是小編給大家介紹的C++多線程中的鎖和條件變量使用教程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成成品网站| 亚洲欧美国产另类| 欧美丝袜美女中出在线| 亚洲国产天堂久久综合网| 国产精品极品美女粉嫩高清在线| 欧美高清在线观看| 成人xvideos免费视频| 亚洲免费电影在线观看| 91色视频在线导航| 亚洲第一男人天堂| 亚洲人成电影网站色…| 欧美另类极品videosbestfree| 国模精品视频一区二区三区| 中文字幕在线观看亚洲| 色哟哟网站入口亚洲精品| 国产91精品久久久久久久| 久久人人爽人人爽人人片亚洲| 亚洲伊人第一页| 久久伊人精品一区二区三区| 欧美另类极品videosbestfree| 77777少妇光屁股久久一区| 国产精品爽爽爽爽爽爽在线观看| 亚洲一区中文字幕| 狠狠色狠狠色综合日日五| 日韩av片永久免费网站| 欧美精品videossex性护士| 欧美一级片免费在线| 91在线免费视频| xvideos国产精品| 亚洲最大中文字幕| 国产在线精品播放| 亚洲精品久久久久久久久久久久久| 成人h片在线播放免费网站| 九色精品免费永久在线| 九九精品视频在线观看| 欧美性精品220| www.欧美三级电影.com| 97精品视频在线播放| 国产亚洲日本欧美韩国| 久久久久久高潮国产精品视| 亚洲网站在线看| 国产精品久久久久久久久久新婚| 日韩精品视频在线播放| 日韩免费视频在线观看| 欧美一级高清免费播放| 中文字幕成人在线| 欧美影院久久久| 国产精品你懂得| 国产精品扒开腿做爽爽爽男男| 91黄色8090| 国产在线视频一区| 色综合色综合网色综合| 92看片淫黄大片欧美看国产片| 亚洲综合精品伊人久久| 中文字幕日韩精品在线| 欧美裸体男粗大视频在线观看| 日韩电影视频免费| 欧美性生交大片免网| 亚洲全黄一级网站| 欧美不卡视频一区发布| 欧美激情xxxx性bbbb| 久久这里有精品| 91亚洲国产成人久久精品网站| 亚洲人成在线电影| xxx欧美精品| 影音先锋欧美在线资源| 久久露脸国产精品| 福利二区91精品bt7086| 中文字幕欧美精品在线| 久久久久久18| www.日韩视频| 国产精品美女www爽爽爽视频| 亚洲视频专区在线| 久久777国产线看观看精品| 亚洲国产精品yw在线观看| 亚洲欧洲日产国码av系列天堂| 亚洲成人精品久久| 欧美重口另类videos人妖| 91在线观看欧美日韩| 欧美激情第三页| 一本色道久久综合亚洲精品小说| 亚洲图片制服诱惑| 亚洲午夜精品久久久久久久久久久久| 国产精品永久在线| 国产精品入口免费视| 欧美www视频在线观看| 国产香蕉精品视频一区二区三区| 92裸体在线视频网站| 日韩在线观看精品| 国产欧美一区二区三区久久| 日韩免费av片在线观看| 日韩欧美精品中文字幕| 国产99久久久欧美黑人| 日韩精品免费综合视频在线播放| 亚洲大胆人体视频| 裸体女人亚洲精品一区| 久久久久久久久久婷婷| 尤物九九久久国产精品的特点| 九九热最新视频//这里只有精品| 国产成人精品一区二区在线| 国产精品视频成人| 欧美第一黄网免费网站| 亚洲色图综合网| 91视频国产一区| 国产精品自产拍在线观| 欧美日韩亚洲系列| 久久亚洲精品小早川怜子66| 日韩av三级在线观看| 亚洲欧美日韩精品久久| 欧美亚洲国产精品| 欧美亚洲国产日韩2020| 日韩亚洲欧美中文高清在线| 欧美丰满少妇xxxx| 国内精品久久久久影院 日本资源| 国产在线观看91精品一区| 亚洲天堂免费视频| 在线看福利67194| 亚洲黄色免费三级| 亚洲欧美精品伊人久久| 8050国产精品久久久久久| 亚洲成人中文字幕| 国产成人在线一区二区| 日韩高清人体午夜| 国产精品日韩一区| 18一19gay欧美视频网站| 久久综合伊人77777蜜臀| 亚洲男子天堂网| 91精品久久久久久久久久| 91欧美精品成人综合在线观看| 久久人人爽人人爽人人片av高请| 日韩欧美在线中文字幕| 97香蕉超级碰碰久久免费的优势| 国产欧美一区二区三区久久人妖| 欧洲成人在线观看| 久久久久久久久久久网站| 亚洲视频在线免费看| 成人精品一区二区三区电影黑人| 欧美激情一区二区久久久| 国产日韩欧美影视| 97香蕉久久超级碰碰高清版| 久久久久久国产精品美女| 国产精品免费网站| 中文字幕久热精品在线视频| 欧美精品一区在线播放| 国产精品1234| 91av在线播放| 色系列之999| 中文字幕v亚洲ⅴv天堂| 69影院欧美专区视频| 亚洲女人天堂成人av在线| 欧美日韩中文字幕综合视频| 欧美另类极品videosbest最新版本| 欧美在线视频一区二区| 亚洲国产精品热久久| 欧美日韩午夜剧场| 国产精品三级在线| 亚洲最大成人网色| 久久久亚洲国产| 亚洲精品v欧美精品v日韩精品| 日韩av资源在线播放| 亚洲国产另类久久精品| 亚洲午夜激情免费视频| 亚洲欧美制服综合另类| 日韩在线视频免费观看高清中文|