假设我有以下代码片段:
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
。