国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

C++11 多線程同步 互斥鎖 條件變量

2019-11-06 07:29:00
字體:
來源:轉載
供稿:網友

在多線程程序中,線程同步(多個線程訪問一個資源保證順序)是一個非常重要的問題,linux下常見的線程同步的方法有下面幾種:

互斥鎖條件變量信號量

這篇博客只介紹互斥量和條件變量的使用。

互斥鎖和條件變量

通常情況下,互斥鎖和條件變量是配合使用的,互斥鎖用于短期鎖定,主要保證線程對臨界區的進入;條件變量用于線程長期等待,在wait的時候會釋放鎖。操作的API如下所示(介紹最常用的):

std::mutex : 獨占的互斥量,不能遞歸使用 std::condition_variable :條件變量,配合 std::unique<std::mutex>進行wait操作。 std::condition_variable_any 和任意帶有lock,unlock的mutex配合使用,但是效率比std::condition_variable差。

舉個栗子:

10個人排隊使用打印機,任一時刻只有一個人能使用。用一個變量i01兩種狀態分別表示打印機能不能使用。這個程序這樣寫,詳細解釋見注釋:

#include<iostream>#include<condition_variable>#include<vector>#include<thread>std::vector<std::thread> tv; //保存線程的情況std::condition_variable_any m_t; //條件變量std::mutex lock; //互斥鎖int i = 1; //打印機資源 初始為1 表示可用void subi() { std::lock_guard<std::mutex> locker(lock); //使用之前先加鎖 while(i == 0){ //如果不可用 m_t.wait(lock); //將當前線程阻塞,注意:此時會釋放鎖 } i--; //使用打印機過程}void addi() { std::lock_guard<std::mutex> locker(lock); //同理,放棄使用的時候先加鎖 i++; //是資源變為可用 m_t.notify_all(); //通知其余阻塞的使用者可以使用了}void func(int j) { subi(); std::cout << "I am thread "<< j << " , i = " << i << std::endl; addi();}int main(int argc,char *argv[]){ for(int j = 0; j < 10 ; ++j) { std::thread t(func,j); tv.push_back(std::move(t)); } for(auto &thread : tv) { thread.join(); } return 0;}

測試情況應該是:每個進程輸出的i都為0,表示每個進程都在合理的使用打印機,沒有出現同時使用的情況,即i < 0的情況。

$ g++ condition.cpp -pthread //注意鏈接pthread

這里寫圖片描述

嗯,可見我們的使用姿勢是正確的~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 丰县| 晋宁县| 渝中区| 额敏县| 浦东新区| 玉屏| 甘德县| 阿合奇县| 涟源市| 平顶山市| 民丰县| 吐鲁番市| 开江县| 浦北县| 堆龙德庆县| 龙里县| 东光县| 宁安市| 桐梓县| 邹平县| 兰西县| 新密市| 乌兰察布市| 永胜县| 景洪市| 金川县| 迁安市| 辽宁省| 九龙城区| 通江县| 搜索| 陆良县| 宁阳县| 玉山县| 鄂托克旗| 年辖:市辖区| 盘锦市| 永登县| 商洛市| 师宗县| 京山县|