![](/img/trans.png)
[英]How to understand RELAXED ORDERING in std::memory_order (C++)
[英]Example of misuse of std::memory_order::relaxed in C++ Standard [algorithms.parallel.exec/5 in n4713]
在 C++ 標准中濫用std::memory_order::relaxed
的例子之一:
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 兩個線程。 不?
“不正確:假定執行順序”。 什么是“假定的執行順序”?
它假設 lambda 的主體由多個線程而不是一個線程執行。 該標准寧願說它可以並行執行。
“上面的例子取決於迭代的執行順序”中的“迭代”指的是什么?
它可能是指另一個線程執行lambda。 但標准不保證有另一個線程。 見execution_policy_tag_t :
parallel_policy
執行策略類型,用作消除並行算法重載的歧義並指示並行算法的執行可以並行化的唯一類型。 使用此策略調用的並行算法中元素訪問函數的調用(通常指定為 std::execution::par)被允許在調用線程或由庫隱式創建的線程中執行以支持並行算法執行。 在同一線程中執行的任何此類調用相對於彼此的順序是不確定的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.