下面的代码有什么问题?我预计消费者 1 和消费者 2 会生成 10 个,但有时会看到 -1。
#include <thread>
#include <atomic>
#include <cassert>
#include <string>
std::atomic<int> global;
void producer()
{
global.store(10, std::memory_order_release);
}
void consumer1()
{
int a = global.load(std::memory_order_acquire);
printf("a in consumer1 %d\n", a);
}
void consumer2()
{
int a = global.load(std::memory_order_acquire);
printf("a in consumer2 %d\n", a);
}
int main()
{
global.store(-1, std::memory_order_seq_cst);
std::thread t1(producer);
std::thread t2(consumer1);
std::thread t3(consumer2);
t1.join(); t2.join(); t3.join();
}
我懂了a in consumer1 10
a in consumer2 10
和a in consumer1 -1
a in consumer2 10
如果我理解正确的话,线程的作用是memory_order_acquire
始终与执行此操作的线程同步memory_order_release
。我错了吗?
我在 x86-64 位机器上运行。我正在编译
g++ file.cpp -pthread -std=c++11
原子变量有一个非常好的属性,即读取的值是之前写入的值。通过释放/获取语义,它甚至是last写入的值。
在本例中,您有 2 次写入和两次读取。仅对 -1 的写入进行排序 - 在读取之前,对 10 的写入不进行排序。因此,任一值都可能是最后写入的。保证你读到的是-1或10而不是垃圾。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)