以下代码有什么问题?我期望看到 consumer1 和 consumer2 输出 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在consumer1中为10
a在consumer2中为10
以及
a在consumer1中为-1
a在consumer2中为10
如果我理解正确,使用memory_order_acquire
的线程总是与使用memory_order_release
的线程同步。我错了吗?
我在x86-64位机器上运行。我使用以下编译方式:
g++ file.cpp -pthread -std=c++11
global
被生产者更新,消费者将看到更新。可能通过强制缓存更新或其他必要的方式实现。这并不意味着如果消费者超前于生产者运行,它会停止并等待。 - Bo Persson