Gra*_*Lup 1 c++ memory parallel-processing multithreading multicore
我需要为结构的某些成员提供同步.
如果结构是这样的
struct SharedStruct {
int Value1;
int Value2;
}
Run Code Online (Sandbox Code Playgroud)
我有一个全局变量
SharedStruct obj;
Run Code Online (Sandbox Code Playgroud)
我希望从处理器写入
obj.Value1 = 5; // Processor B
Run Code Online (Sandbox Code Playgroud)
能够立即看到其他处理器,以便在我测试该值时
if(obj.Value1 == 5) { DoSmth(); } // Processor A
else DoSmthElse();
Run Code Online (Sandbox Code Playgroud)
获取新值,而不是缓存中的旧值.
首先,我认为如果我在写/读取值时使用volatile,就足够了.但我读到,挥发性无法解决这类问题.
保证成员在2/4/8字节边界上正确对齐,在这种情况下写入应该是原子的,但我不确定缓存如何干扰它.
使用记忆障碍(mfence,sfence等)就够了吗?或者需要一些互锁操作?
或者类似的东西
lock mov addr, REGISTER
Run Code Online (Sandbox Code Playgroud)
?
最简单的显然是一些锁定机制,但速度是至关重要的,无法承受锁:(
编辑
也许我应该澄清一下.该值仅设置一次(表现得像一个标志).所有其他线程只需阅读它.这就是为什么我认为它可能是一种在不使用锁的情况下强制读取这个新值的方法.
提前致谢!
没有免费午餐这样的事情.如果从多个线程访问您的数据,并且必须通过其他线程立即看到更新,则必须通过互斥锁,读取器/写入器锁或某种类似机制来保护共享结构.
在同步代码时,性能是一个有效的问题,但它的正确性胜过它.一般来说,首先瞄准正确性,然后分析您的代码.在尚未确定正确性的情况下担心性能是过早优化.