3

std::memory_order::relaxedC++ 標準におけるの誤用の例の 1 つ:

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
});

そして、それは言う、

上記の例は、反復の実行順序に依存し、両方の反復が同じ実行スレッドで順次実行される場合は終了しません。

質問:

  1. コメントには、「間違っています。実行順序を想定しています」と書かれています。「想定実行順序」とは?私はそれが恋しいです。

  2. 「上記の例は、反復の実行順序に依存します」で「反復」とは何を指していますか? whileループでの繰り返しということですか?それとも、の繰り返しを指していますstd::for_eachか?

  3. の反復がstd::for_each異なるスレッドによって並列に実行される場合、反復/スレッドの 1 つが終了しないというのはまだ真実ではありませんか? x.fetch_add(1, std::memory_order::relaxed)はアトミックであるため、1 つのスレッドが 1 を作成しx、別のスレッドがx2 を作成し、両方のスレッドで x == 1 を持つことは不可能です。いいえ?

4

1 に答える 1