`std :: mutex`和`std :: lock`是否保证处理器间代码中的内存同步?

时间:2012-06-08 13:31:56

标签: c++ multithreading c++11 openmp

我目前正在使用openMP来编写在多核节点上运行的代码。 openMP有一个特定的内存模型,可以保证在获取锁定时在不同内核上运行的线程之间同步内存。

我考虑使用C ++ 11构造(std::threadstd::mutexstd::lock)而不是openMP(因为它们具有更大的灵活性)并且想知道处理器之间的内存同步是否/如何是保证在这里?如果没有,我该如何强制执行呢?

1 个答案:

答案 0 :(得分:10)

该标准对std::mutex的同步做出以下保证,见§30.4.1.2[thread.mutex.requirements.mutex] / 6-25

  

表达式m.lock()应格式正确,并具有以下语义

     

同步:对同一对象的先前unlock()操作应与此操作同步。

同样,

  

表达式m.unlock()应格式正确,并具有以下语义

     

同步:此操作与后续锁定操作同步,后者获取对同一对象的所有权。

(其中“与...同步”是$ 1.10中解释的特定术语,尽管通过阅读 C ++ Concurrency In Action 更容易理解