“std::mutex”和“std::lock”是否保证处理器间代码中的内存同步
Does `std::mutex` and `std::lock` guarantee memory synchronisation in inter-processor code?
我目前正在使用 openMP 编写在多核节点上运行的代码。 openMP 具有特定的内存模型,可确保在获取锁时在不同内核上运行的线程之间同步内存。
我考虑使用 C++11 结构(std::thread
std::mutex
和 std::lock
)而不是 openMP(因为它们具有更大的灵活性),并想知道这里是否/如何保证处理器之间的内存同步?如果没有,我该如何执行?
该标准在 §30.4.1.2[thread.mutex.requirements.mutex]/6-25 中对std::mutex
的同步做出了以下保证
表达式 m.lock() 应格式正确,并具有以下语义
同步:先前对同一对象的 unlock() 操作应与此操作同步。
而且,同样,
表达式 m.unlock() 应格式正确,并具有以下语义
同步:此操作与获取同一对象所有权的后续锁定操作同步。
(其中"同步"是 $1.10 中解释的特定术语,尽管通过阅读 C++ 并发在行动中更容易理解)
相关文章:
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- "std::forward"和"std::move"真的不生成代码吗?
- 使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2
- std::string == 运算符在代码中不起作用
- 为什么 std::invocable 概念阻止了此代码的编译
- 如何防止使用 std::shared_ptr 的代码中的内存泄漏
- "p"数组如何使用 std::normal_distribution 存储以下代码中的值C++?
- 为什么使用 std::vector 的代码不能编译,但使用 std::unique_ptr 如果没有 noexcept
- 如何处理给定代码中的 std::out_of_range 错误?
- 在带有模板的函数中传递未知大小的 std::数组.如何更正此代码?
- 如何使用 GDB 从功能C++逐步调试到 std::function 用户代码?
- 避免使用 std::any 编写相同的重复类型检查代码
- 示例代码中使用分隔符将 std::string 拆分为 std::vector 的范围问题
- 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 如何在数组类型的模板代码中计算std::size_t
- 将json代码格式化为std::string
- std::out_of_range 使用 libserial 库的 C++ 代码中的错误
- 为什么代码使用 std::map 无法编译?
- 这段 C++ 代码的奇怪行为(std::wcout 和 std::exception)