【发布时间】:2015-10-08 05:34:19
【问题描述】:
下面的代码有什么问题?我预计消费者 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
【问题讨论】:
-
在你的例子中,我从来没有得到-1,总是“a in consumer1 10 a in consumer2 10”你能睡一觉以得到你发布的“错误”结果吗?
-
运行多次。我运行了至少 20 次,其中一次运行显示 -1。
-
我已经完成了 100 次测试。
-
但我确实看到这是直接从我的终端粘贴的输出。 madhura@linux64 ~ ./a.out a in consumer2 10 a in consumer1 10 madhura@linux64 ~ ./a.out a in consumer1 -1 a in consumer2 10
-
“同步于”表示如果
global已被生产者更新,消费者将看到更新。可能通过强制缓存更新或任何需要的方式。这并不意味着如果消费者跑在生产者前面,它就会停下来等待。
标签: c++ multithreading c++11 parallel-processing atomic