使用std :: mutex发布并获取

jco*_*der 4 c++ c++11

这是一个关于C++标准的问题.我只能访问标准草案,所以如果官方标准不同,我道歉.如果我误解了它是如何工作的,请随时纠正我.

假设我有两个线程,一个写入字符串,另一个复制该字符串的内容.我保护对它们的访问使用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();
Run Code Online (Sandbox Code Playgroud)

我的理解是,为了使它在线程之间可靠地工作,线程1必须在设置字符串后执行Release操作,并且两个必须在读取字符串之前执行Acquire.

阅读C++ 11的标准草案我看不到任何说明这样std::mutex做的事情,虽然很明显它是预期的,或者互斥体对任何东西都没用.

有人能指点我看相关部分吗?标准中的措辞对于随意的读者来说往往不是很清楚:)

eca*_*mur 8

根据30.4.1.2p11,

同步:unlock()对同一对象的先前操作应与(1.10)[ m.lock()] 同步.

低于1.10p5,

[...]例如,获取互斥锁的呼叫将对包含互斥锁的位置执行获取操作.相应地,释放相同互斥锁的调用将在这些相同位置执行释放操作.非正式地,对A执行释放操作会强制对其他存储器位置的先​​前副作用变得对其他线程可见,这些线程稍后在A上执行消耗或获取操作.[...]