首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Release语义中的内存操作- C++11的内存排序

Release语义中的内存操作- C++11的内存排序
EN

Stack Overflow用户
提问于 2017-09-15 01:56:46
回答 1查看 56关注 0票数 3

我正在尝试理解C++11内存排序的Acquire-Release Semantics

我不明白的是以下断言是否会失败:

代码语言:javascript
复制
#include <atomic>
#include <thread>
#include <cassert>

int global_x{0};
std::atomic_int sync{0};
std::atomic_int atm_y{0};

void thread1()
{
    global_x=100;
    atm_y.store(200, std::memory_order_relaxed);
    sync.store(1,std::memory_order_release);
}

void thread2()
{
    while(!sync.load(std::memory_order_acquire)){;}
    assert(atm_y.load(std::memory_order_relaxed) == 200);
    assert(global_x == 100);
}

int main()
{
    global_x=0;
    sync=0;
    atm_y=0;
    std::thread t1(thread1);
    std::thread t2(thread2);
    t1.join();
    t2.join();
}

我知道sync.store()会因为acquire-release semanticssynchronize-with sync.load(),但是这个语义能保证release之前的内存操作会进入内存(内存)吗?

EN

回答 1

Stack Overflow用户

发布于 2017-09-15 04:24:38

引用安东尼·威廉姆斯的"C++ Concurrency in Action“中一个非常相似的示例(清单5.8):

从atm_y加载的断言永远不会失败,因为对atm_y的存储发生在要同步的存储之前(它们在同一个线程中)。因为要同步的存储与从sync加载同步,所以在从sync加载之前也会发生到atm_y的存储,进而在从atm_y加载之前也会发生。

同样的逻辑也适用于对global_x的赋值。赋值发生在要同步的存储之前,所以断言永远不会触发。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46225563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档