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

Wal*_*ter 5 c++ multithreading openmp c++11

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

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

Cub*_*bbi 10

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

表达式m.lock()应该是格式良好的,并具有以下语义

同步:对同一对象的先前解锁()操作应与此操作同步.

而且,同样地,

表达式m.unlock()应该是格式良好的,并具有以下语义

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

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

  • @Walter简而言之,这意味着发布互斥锁的线程所产生的每个商店对获取互斥锁的线程都是可见的,但对其他线程则不可见.它意味着释放屏障和获取障碍,或它们的等价物. (3认同)