使用获取-释放内存排序的传递同步 我在一本书中引用了一个C++并发操作的例子来更好地理解获取发布模型,但是我有一些问题: std::atomic<int> data[3]; std::atomic<bool> sinc1(false), sinc2(false); void thread_1() { data[0].store(1,std::memory_order_relaxed); data[1].store(2,std::memory_order_relaxed); data[2].store(3,std::memory_order_relaxed); sinc1.store(true,std::memory_order_release); } void thread_2() { while(!sinc1.load(std::memory_order_acquire)) sinc2.store(true,std::memory_order_release); } void thread_3() { while(!sinc2.load(std::memory_order_acquire)) assert(data[0].load(std::memory_order_relaxed)==1); std::cout << data[0] << std::endl; assert(data[1].load(std::memory_order_relaxed)==2); std::cout << data[1] << std::endl; assert(data[2].load(std::memory_order_relaxed)==3); std::cout << data[2] << std::endl; } int main() { std::thread t1(thread_1); std::thread t2(thread_2); std::thread t3(thread_3); t1.join(); t2.join(); t3.join(); return 0; }

使用获取-释放内存排序的传递同步 我在一本书中引用了一个C++并发操作的例子来更好地理解获取发布模型,但是我有一些问题: std::atomic<int> data[3]; std::atomic<bool> sinc1(false), sinc2(false); void thread_1() { data[0].store(1,std::memory_order_relaxed); data[1].store(2,std::memory_order_relaxed); data[2].store(3,std::memory_order_relaxed); sinc1.store(true,std::memory_order_release); } void thread_2() { while(!sinc1.load(std::memory_order_acquire)) sinc2.store(true,std::memory_order_release); } void thread_3() { while(!sinc2.load(std::memory_order_acquire)) assert(data[0].load(std::memory_order_relaxed)==1); std::cout << data[0] << std::endl; assert(data[1].load(std::memory_order_relaxed)==2); std::cout << data[1] << std::endl; assert(data[2].load(std::memory_order_relaxed)==3); std::cout << data[2] << std::endl; } int main() { std::thread t1(thread_1); std::thread t2(thread_2); std::thread t3(thread_3); t1.join(); t2.join(); t3.join(); return 0; },c++,C++,我有两个问题: 我错过什么了吗 当它没有失败时,我得到以下输出: 要么: 1 2 3 或 sync1上的版本acquire内存模型不应该对存储数据给出特定的内存顺序吗 如果我想遵循严格的命令,为什么我要使用relaxed 我明白我可以用放松和放松来达到一定的顺序。但显然它不起作用 0112 有人能给我澄清一下这些观点吗 谢谢。来自 内存顺序:没有同步 或排序约束,则此操作只需要原子性 C++14对排序有一些进一步的限制,这些限制在这里不适用 void thread_1() { da

我有两个问题:

我错过什么了吗

当它没有失败时,我得到以下输出:

要么:

1 2 3  

sync1上的版本acquire内存模型不应该对存储数据给出特定的内存顺序吗

如果我想遵循严格的命令,为什么我要使用relaxed

我明白我可以用放松和放松来达到一定的顺序。但显然它不起作用

0112

有人能给我澄清一下这些观点吗

谢谢。

来自

内存顺序:没有同步 或排序约束,则此操作只需要原子性

C++14对排序有一些进一步的限制,这些限制在这里不适用

void thread_1() {
    data[0].store(1,std::memory_order_relaxed);
    data[1].store(2,std::memory_order_relaxed);
    data[2].store(3,std::memory_order_relaxed);
--上下文切换--

这些线程现在可以以随机顺序对其他线程可见,因为它们只保证原子操作。因此,其他线程可以看到0/1、0/2、0/3的任意组合,例如0、2、0,但不能看到0、1、2。。。除非数据在开始之前有这些值,否则将第一行更改为

std::atomic<int> data[3] = { -1,-1,-1 }; // lets make sure we know what we have
以前对内存的所有写入必须已完成

内存\u顺序\u使用此内存顺序释放存储操作 执行释放操作:先写入其他内存位置 对在上执行消费或获取的线程可见 同一地点

幸运的是,线程_2在同一位置执行了一次获取

void thread_2() {   
    while(!sinc1.load(std::memory_order_acquire))  <----------- bug here missing ;
    sinc2.store(true,std::memory_order_release);
}
那么一会儿!sinc1我们把sinc2设为真我想那不是你想要的。
为了避免这样的问题,总是在一段时间内把{}放在后面。

问题似乎是您的代码遗漏了;在while循环之后

但除此之外,我同意你的看法:在这两个地方都有分号,断言永远不能触发,代码将始终打印1 2 3

std::atomic<int> data[3] = { -1,-1,-1 }; // lets make sure we know what we have
    sinc1.store(true,std::memory_order_release);
}
void thread_2() {   
    while(!sinc1.load(std::memory_order_acquire))  <----------- bug here missing ;
    sinc2.store(true,std::memory_order_release);
}