1

次のコード スニペットがあるとします。

std::atomic<int> a(0);

void thread1()
{
    int x = a.fetch_add(1, std::memory_order_relaxed);
    std::cout << x << std::endl;
}

void thread2()
{
    int x = a.fetch_add(1, std::memory_order_relaxed);
    std::cout << x << std::endl;
}

int main()
{
    std::thread t1(thread1);
    std::thread t2(thread2);

    t1.join();
    t2.join();
}

0 0問題は、結果として得られるかどうかです。

ここでは、両方のスレッドがリラックスしたメモリ順序で読み取りと変更aを行っているため、両方のスレッドが のゼロ値を認識しているように見えますa。しかし、実際には0 1またはしか見えません1 0

4

1 に答える 1

4

いいえ、できません0 0。緩和されたメモリ順序は、操作がアトミックでないことを意味するものではありません。0 0発生する唯一の方法は、読み取り、変更、書き込みを非アトミックにすることです。しかし、std::atomic::fetch_addアトミックにfetch_add動作するため、一度に動作できるのは 1 つだけであることがわかっているため、0 1またはのみ1 0が可能です。

于 2016-06-04T23:30:37.973 に答える