次のコード スニペットがあるとします。
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
。