std::memory_order::relaxed
C++ 标准中滥用 of 的例子之一:
std::atomic<int> x{0};
int a[] = {1,2};
std::for_each(std::execution::par, std::begin(a), std::end(a), [&](int) {
x.fetch_add(1, std::memory_order::relaxed);
// spin wait for another iteration to change the value of x
while (x.load(std::memory_order::relaxed) == 1) { } // incorrect: assumes execution order
});
然后它说,
上面的例子取决于迭代的执行顺序,如果两个迭代在同一个执行线程上按顺序执行,则不会终止。
问题:
评论说,“不正确:假定执行顺序”。什么是“假定的执行顺序”?我想念它。
“上面的例子取决于迭代的执行顺序”中的“迭代”指的是什么?这是否意味着while循环中的迭代?或者它是指的迭代
std::for_each
?如果 的迭代
std::for_each
由不同的线程并行执行,那么其中一个迭代/线程不会退出是否仍然正确?因为x.fetch_add(1, std::memory_order::relaxed)
是原子的,所以一个线程将产生x
1,另一个线程将产生x
2,并且两个线程都不可能有 x == 1。不?