axe*_*axe 5 c++ atomic volatile memory-fences visual-c++
普通加载在x86上获得了语义,普通商店具有发布语义,但编译器仍然可以重新排序指令.虽然围栏和锁定指令(锁定的xchg,锁定的cmpxchg)会阻止硬件和编译器重新排序,但仍需要普通的加载和存储来保护编译器障碍.Visual C++提供了_ReadWriterBarrier()函数,它可以防止编译器重新排序,同样C++提供volatile关键字也是出于同样的原因.我写这些信息只是为了确保我把一切都弄好.所以上面写的都是真的,有没有理由将其标记为将在_ReadWriteBarrier()保护的函数中使用的volatile变量?
例如:
int load(int& var)
{
_ReadWriteBarrier();
T value = var;
_ReadWriteBarrier();
return value;
}
Run Code Online (Sandbox Code Playgroud)
使变量非易失性是否安全?据我所知,因为函数受到保护,内部编译器无法进行重新排序.另一方面,Visual C++为volatile变量提供了特殊的行为(不同于标准的变量),它使得volatile可以读写原子加载和存储,但是我的目标是x86,而且x86上的普通加载和存储应该是原子的无论如何,对吗?
提前致谢.
C 语言中也提供了 volatile 关键字。“易失性”经常在嵌入式系统中使用,特别是当变量的值可能随时更改时(代码不采取任何操作),三种常见的情况包括从内存映射的外设寄存器或由变量修改的全局变量中读取。中断服务程序或多线程程序中的中断服务程序。
\n\n因此,这是最后一个可以将 volatile 视为与 _ReadWriteBarrier 类似的场景。
\n\n_ReadWriteBarrier 不是一个函数 - _ReadWriteBarrier 不会插入任何附加指令,并且不会阻止 CPU 重新排列读取和写入\xe2\x80\x94,它只会阻止编译器重新排列它们。_ReadWriteBarrier 是为了防止编译器重新排序。
\n\nMemoryBarrier是为了防止CPU重排序!
\n\n编译器通常会重新排列指令...C++ 不包含对多线程程序的内置支持,因此编译器在重新排列代码时假定代码是单线程的。对于 MSVC,请在代码中使用 \xc2\xad_ReadWriteBarrier,以便编译器不会在其中移动读写操作。
\n\n检查此链接以获取有关这些主题的更详细讨论\n http://msdn.microsoft.com/en-us/library/ee418650(v=vs.85).aspx
\n\n关于您的代码片段 - 您不必使用 ReadWriteBarrier 作为 SYNC 原语 - 第一次调用 _ReadWriteBarrier 是不必要的。
\n\n使用 ReadWriteBarrier 时,不必使用 volatile
\n\n你写了“它使易失性读取和写入原子加载和存储” - 我认为这样说是不行的,原子性和易失性是不同的。原子操作被认为是不可分割的 - ... http://www.yoda.arachsys.com/csharp/threads/volatility.shtml
\n 归档时间: |
|
查看次数: |
3224 次 |
最近记录: |