在此代码中使用memory_order_relaxed是否正确
Is it correct to use memory_order_relaxed at this code?
在以下代码中使用std::memory_order_relaxed
是否正确?
#include <atomic>
#include <array>
#include <iostream>
#include <thread>
using namespace std;
int main() {
std::atomic<int> counter(0);
constexpr size_t thread_count = 10;
std::array<std::thread, thread_count> threads;
for (auto& th : threads) {
th = std::thread([&counter]() {
for (int j = 0; j < 100; ++j) {
/*1*/ counter.fetch_add(1, std::memory_order_relaxed);
}
});
}
for (auto& th : threads) th.join();
/*2*/ std::cout << counter.load(std::memory_order_relaxed) << std::endl;
return 0;
}
我有一个方法调用计数器。计数器何时实际递增(/*1*/
)并不重要,只要递增一段时间就足够了。但是当我调用atomic::load
(/*2*/
)时,所做的所有计数器更改都应该是可见的。
在第 /*1*/
行和/*2*/
行中使用std::memory_order_relaxed
是否正确?
是的,这很好。线程连接提供必要的同步点,以确保最终load()
看到正确的值。
相关文章:
- Ascending order c++
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- "static initialization order fiasco"是 constexpr 变量的问题吗?
- 在使用 In Order 遍历成员函数时引发异常(堆栈溢出)时出现问题
- 为什么在与静态库链接时强制执行 order(例如 source.cxx -lstatic)
- "The order of evaluation of expressions is left to right."是什么意思
- memory_order_seq_cst操作的"happens before"关系和"precedes in a single total order"关系有什么区别?
- std::shared_ptr::owner_before 和 std::owner_less:"owner-based order"到底是什么意思?
- C++: The order of std::cout
- 如何在 std::set 中为 FIND 和 ORDER 定义不同的条件
- C++ 在结构上实现 ORDER BY
- Xcode-在项目导航器中创建新的C++文件-Order.h和.cpp-Order
- Order of cvScalar
- Xcode C++ Struct Order
- 使用c++编写带有BOM (Byte Order Mark)的csv文件
- "std::map with mutexes"与并行插入、查找、擦除之间是否有任何速度测试"libcds maps (Michael Hashmap and Split Order List)"?
- LibCds: Michael Hashmap and Split Order List