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

Does `std::mutex` and `std::lock` guarantee memory synchronisation in inter-processor code?

本文关键字:std 代码 内存 同步 mutex lock 是否 处理器      更新时间:2023-10-16

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

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

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

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

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

而且,同样,

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

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

(其中"同步"是 $1.10 中解释的特定术语,尽管通过阅读 C++ 并发在行动中更容易理解)