假設我們有一個全域變數和一個全域非成員函式。
int GlobalVariable = 0;
void GlobalFunction();
我們有
std::mutex MutexObject;
然后在其中一個執行緒中,我們有以下代碼塊:
{
std::lock_guard<std::mutex> lock(MutexObject);
GlobalVairable ;
GlobalFunction()
}
現在,在另一個并行運行的執行緒中,如果我們這樣做會發生什么:
{
//std::lock_guard<std::mutex> lock(MutexObject);
GlobalVairable ;
GlobalFunction()
}
所以問題是,互斥鎖是否只鎖定自己而不是在被另一個執行緒擁有時被擁有,而不關心在關鍵代碼中嘗試訪問的內容?還是編譯器或運行時作業系統實際上將關鍵代碼中正在訪問的記憶體位置指定為現在被 MutexObject 阻止?
我的猜測是前者,但我需要聽聽有經驗的程式員的意見;感謝您花時間閱讀我的問題。
uj5u.com熱心網友回復:
是前者。互斥鎖與您使用互斥鎖保護的物件之間沒有關系。(通常,編譯器不可能準確推斷出給定的代碼塊將修改哪些物件。)互斥鎖背后的魔力完全來自于它所做的時間排序保證:執行緒在釋放互斥鎖之前所做的一切都是可見的在它抓住互斥鎖后轉到下一個執行緒。但是這兩個執行緒都需要主動使用互斥鎖才能實作。
真正關心執行緒訪問和修改了哪些記憶體位置并在此基礎上安全構建的系統是“事務記憶體”。它沒有被廣泛使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/371832.html
上一篇:如何將常量佇列傳遞給函式?
