使用std :: mutex发布并获取

时间:2012-11-13 11:01:06

标签: 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();

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

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

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

1 个答案:

答案 0 :(得分:8)

根据30.4.1.2p11,

  

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

低于1.10p5,

  

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