3 資料競爭與互斥物件

2021-08-21 07:25:24 字數 1477 閱讀 4023

這節課終於要解決之前的乙個bug了,也就是資料競爭的問題,先看一下如下**:

#include 

#include

#include

using

namespace

std;

void function_1()

int main(int argc, char** argv)

#include 

#include

#include

#include

#include

using

namespace

std;

std::mutex mu;

void shared_print(string msg,int id)

void function_1()

}int main(int argc, char** argv)

t1.join(); 

return

0;}

哦,是不是很完美的解決了資料競爭的問題了?但是,如果在shared_print函式中,如果在lock()和unlock()之間出現異常的話,那麼mu就會被永遠鎖住了,這又該怎麼解決呢?別擔心,兵來將檔,水來土掩,這裡引入新的型別,即std::lock_guard,它可以保證,即時過程中出現異常,mu物件也可以正常釋放解鎖.

然而,難道你們沒有發現cout本身就是全域性物件嗎,也就是cout並沒有在互斥物件mu的保護下,即其他執行緒也依舊可以在不加鎖的情況下使用cout.所以為了改善這個問題,需要將mu和cout進行繫結.

這裡我們通過自定義乙個類的方式來解決這個資源搶占問題,**如下所示.

#include 

#include

#include

#include

#include

#include

using

namespace

std;

class logfile

void shared_print(std::string msg,int id)

//另外需要強調的是,我們既然選擇這種方式來繫結mu和f,那我們就不能將f暴露在類外,類似如下這些函式都是不允許的

//std::ofstream& getstream()

//void process(void fun(ofstream&))

//private:

std::mutex mu;

std::ofstream f;// 這樣就將mu和f繫結在了一起,當logfile物件在使用f的時候,其他執行緒就不能使用它

};void function_1(logfile& log)

}int main(int argc, char** argv)

t1.join();

return

0;}

多執行緒例子之資料競爭和互斥物件 鎖 互斥量

意看注釋。include include include include include std mutex mu void shared print std string msg,int id class logfile void shared print std string id,int va...

競爭與同步 互斥量 讀寫鎖

由於執行緒之間的絕大多數資源都是共享的,當多個執行緒同時訪問乙個資源時,可能會出現資料不完整 不一致的情況,此時就需要多個執行緒協調訪問資源 競爭訪問,需要用於互斥技術 最終達到資料一致 完整 同步 也叫互斥鎖,當互斥量處於鎖定狀態時,其他執行緒加鎖會處於阻塞狀態,只有鎖被開啟時,被阻塞的執行緒才能...

c 多執行緒thread操作(三)資料競爭互斥訪問

c 多執行緒thread操作 一 環境部署 c 多執行緒thread操作 二 執行緒管理 c 多執行緒thread操作 三 資料競爭互斥訪問 c 多執行緒thread操作 四 死鎖的問題和解決 c 多執行緒thread操作 五 unique lock加鎖 c 多執行緒thread操作 六 條件變數的...