我理解C++ 11中内存排序的基本规则,特别是release-acquire排序。我在两个线程之间共享了一大块内存,我不需要原子性,但是要确保线程完成的所有更改最终都可以在另一个线程中看到,尤其是在具有宽松内存模型的平台上。不锁定线程之间的数据可见性
可以简单地使用原子防护变量var来触发内存同步吗?例如,
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它应该工作,但我没有在网络上看到这样的解决方案,并且不容易测试它是否真的按照我的意图进行测试。
可以吗?如果是这样,有没有更优雅的方式?
嗯。你是对的,这确实是一个未定义的行为。 – Ferenc
嗯。你说得对,这是标准确实是一个未定义的行为。 想象一下,我模拟一个帧缓冲区,一个线程在随机访问中连续写入的内容,另一个线程想定期读出整个缓冲区来处理它。撕裂不是问题。 我怎样才能解决这个没有任何类型的锁定在任何线程? – Ferenc
@Ferenc这个场景确实是你问题的一部分..我会更新答案 – LWimsey