据我所知,编译器(软件)和CPU (硬件)会出于性能原因对指令进行重新排序,而内存缓冲器可以防止重新排序,它们是在编译器级别或CPU级别。
MSDN说"Interlockedxxxx函数生成一个完整的内存屏障(或栅栏)来确保内存操作按顺序完成“,我不知道”完整内存屏障“是指硬件屏障还是软件屏障?
boost::atomic做了什么?硬件障碍?刷新CPU缓存/存储缓冲区?
memory_order_acquire语义使软件或硬件变得简单?
发布于 2013-08-28 23:12:53
它提供指定的内存模型,使用您所使用的平台所需的任何屏障。
请记住,boost::atomic是一种可移植的应用程序接口,可以在许多不同的平台上实现。另一方面,Windows桌面API只能在英特尔上运行。因此,MSDN文档将包含特定于平台的信息(因为只有三个平台-- x86、x64、安腾),而atomic文档则没有。
(注意:大多数Win32也在ARM处理器上的Windows CE中使用,但有一组平行的文档页。桌面页面没有覆盖ARM。而涵盖Windows 8 RT的"Windows Store“API则是另一组文档。)
发布于 2013-08-28 23:13:15
boost::atomic做了什么?硬件障碍?刷新CPU缓存/存储缓冲区?
有关系吗?
原子操作建立同步关系。它们在目标机器上做任何需要做的事情,以实现由这些关系定义的行为。
例如,具有store-release语义的操作与具有加载-获取语义的操作同步。如果操作A与操作B同步,那么就会说A线程间发生在B之前,这意味着A发生在B之前,这意味着A和B不会导致数据竞争。(同步关系的名称以强调标记)
发布于 2013-08-29 02:52:00
在修改线程之间共享的值时,涉及三个问题。首先,在读或写值的过程中有可能发生线程切换,结果是其他线程可能会看到部分写入(即无意义的)值。其次,每个处理器都有自己的数据缓存,因此来自一个处理器上的一个线程的写操作可能对运行在另一个处理器上的另一个线程不可见。第三,编译器可以在一定范围内对指令进行重新排序,以提高代码的效率。std::atomic消除了所有三种可能性:原子对象的读取和写入不会中断;写入原子类型会将缓存刷新到主内存,从原子类型读取会从主内存重新加载缓存;编译器不允许跨原子类型的操作移动指令。如何做这些事情的细节(包括是否需要做任何事情)取决于目标平台,但这都是在标准库的实现中完成的。编辑:哇,刚刚注意到这个问题是关于Boost的。我没有深入研究它,但我假设Boost满足与标准库相同的约束,并适当地实现这些约束。
https://stackoverflow.com/questions/18491713
复制相似问题