簡體   English   中英

使用std :: mutex發布並獲取

[英]Release and Acquire with std::mutex

這是一個關於C ++標准的問題。 我只能訪問標准草案,所以如果官方標准不同,我道歉。 如果我誤解了它是如何工作的,請隨時糾正我。

假設我有兩個線程,一個寫入字符串,另一個復制該字符串的內容。 我使用std::mutex myMutex;保護對它們的訪問std::mutex myMutex; 我知道你通常應該使用RAII類來鎖定,我只是明確地使用了鎖定和解鎖來使示例更加明確。

// Global variable
std::string message;
std::mutex myMutex;

// Thread one
myMutex.lock();
message = "Hello";
myMutex.unlock();

// Thread two
myMutex.lock();
std::string copy = message;
myMutex.unlock();

我的理解是,為了使它在線程之間可靠地工作,線程1必須在設置字符串后執行Release操作,並且兩個必須在讀取字符串之前執行Acquire

閱讀C ++ 11的標准草案我看不出任何說明std::mutex這樣做的東西,雖然很明顯它是預期的,或者互斥體對任何東西都沒用。

有人能指點我看相關部分嗎? 標准中的措辭對於隨意的讀者來說往往不是很清楚:)

根據30.4.1.2p11,

同步 :對同一對象的先前unlock()操作應與(1.10)[ m.lock() ]同步。

低於1.10p5,

[...]例如,獲取互斥鎖的呼叫將對包含互斥鎖的位置執行獲取操作。 相應地,釋放相同互斥鎖的調用將在這些相同位置執行釋放操作。 非正式地,對A執行釋放操作會強制對其他存儲器位置的先​​前副作用變得對其他線程可見,這些線程稍后在A上執行消耗或獲取操作。 [...]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM