gpt4 book ai didi

c++ - 并行化 std::for_each 中的数据竞争

转载 作者:行者123 更新时间:2023-12-01 23:00:54 25 4
gpt4 key购买 nike

关于cpp reference website on execution policy有一个这样的例子:

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);
while (x.load(std::memory_order_relaxed) == 1) { } // Error: assumes execution order
});

如您所见,这是一个(据称)错误代码的示例。但我真的不明白这里的错误是什么,在我看来,代码的任何部分都没有假定执行顺序。 AFAIK,fetch_add 的第一个线程将等待第二个线程,但仅此而已,没有问题的行为。我是否遗漏了什么并且存在一些错误?

最佳答案

The execution policy type used as a unique type to disambiguate parallel algorithm overloading and indicate that a parallel algorithm's execution may be parallelized. The invocations of element access functions in parallel algorithms invoked with this policy (usually specified as std::execution::par) are permitted to execute in either the invoking thread or in a thread implicitly created by the library to support parallel algorithm execution. Any such invocations executing in the same thread are indeterminately sequenced with respect to each other.

据我所知,这里的问题是,如果系统使用单个线程,则无法保证使用多少个线程 - 这里将会出现无限循环 (while (x. load(std::memory_order_relaxed) == 1) { } 永远不会完成)。
所以我猜这个注释意味着这段代码错误地依赖于多个线程执行,这会导致 fetch_add 在某个时刻被多次调用。
您得到的唯一保证是对于每个线程,调用不会交错。

关于c++ - 并行化 std::for_each 中的数据竞争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58621898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com