4

这是关于 C++ 标准的问题。我只能访问标准草案,所以如果这与官方标准不同,我深表歉意。另外,如果我误解了它的工作原理,请随时纠正我。

假设我有两个线程,一个写入字符串,一个复制该字符串的内容。我使用std::mutex myMutex; 我知道您通常应该将 RAII 类用于锁来保护对它们的访问,我只是显式地使用了 lock 和 unlock 以使示例更加明确。

// 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();

我的理解是,为了在线程之间可靠地工作,线程一必须在设置字符串后执行释放操作,而线程二必须在读取字符串之前执行获取操作。

阅读 C++11 的标准草案,我看不到任何说明这样std::mutex做的内容,尽管很明显它是预期的,否则互斥锁对任何事情都无用。

有人可以将我指向相关部分以查看吗?对于普通读者来说,标准中的措辞通常并不完全清楚:)

4

1 回答 1

9

根据 30.4.1.2p11,

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

在 1.10p5 下,

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

于 2012-11-13T11:16:03.007 回答