【发布时间】:2017-04-03 22:05:13
【问题描述】:
我了解 C++11 中内存排序的基本规则,尤其是释放-获取排序。我在两个线程之间共享了一大块内存,我不需要原子性,但希望确保最终由一个线程完成的所有更改在另一个线程中都是可见的,尤其是在具有宽松内存模型的平台上。
可以简单地使用原子保护变量来触发内存同步吗?例如,
std::atomic<bool> guardVar;
char *shared_mem=get_shared_mem();
(thread 1)
while(true) {
happens_many_things();
do_whatever_I_want_with_shared_mem();
guardVar.store(0, std::memory_order_release);
}
(in thread 2)
while(true) {
guardVar.load(std::memory_order_acquire);
read_shared_mem_no_problem_if_inconsistent();
}
同样,如果线程 2 在 do_whatever_I_want_with_shared_mem() 中间读取“半就绪”状态也不是问题,我只是想确保在明确定义的点之后获得线程 1 写入的所有更改。
基于this article 它应该可以工作,但我在网上没有看到这样的解决方案,并且不容易测试它是否真的符合我的意图。
没事吧?如果是,有没有更优雅的方式?
【问题讨论】:
标签: multithreading c++11 synchronization shared-memory atomic