据我所知,编译器(软件)和CPU(硬件)将重新排序指令 出于性能原因, 和内存berrier可以防止重新排序, 它们处于编译器级别或CPU级别。
MSDN说“Interlockedxxxx函数生成一个完整的内存屏障(或栅栏),以确保内存操作按顺序完成”,我不知道“完整的内存屏障”意味着硬件或软件障碍?
boost :: atomic做了什么?硬件障碍?刷新CPU缓存/存储缓冲区?
memory_order_acquire语义是一个软件还是硬件?
答案 0 :(得分:3)
它提供指定的内存模型,使用您正在使用的平台所需的任何障碍。
请记住boost::atomic
是一个可移植的API,可以在许多不同的平台上实现。另一方面,Windows桌面API仅在Intel上运行。因此,MSDN文档将包含特定于平台的信息(因为只有三个平台 - x86,x64,Itanium),而atomic
文档则不会。
(注意:大多数Win32也用于ARM处理器上的Windows CE,但是有一组并行的文档页面。桌面页面不包括ARM。而涵盖Windows 8 RT的“Windows Store”API另一组文档。)
答案 1 :(得分:2)
boost::atomic
做了什么?硬件障碍?刷新CPU缓存/存储缓冲区?
重要吗?
原子操作建立同步关系。他们在目标机器上做任何需要完成的事情,以实现这些关系定义的行为。
例如,具有存储释放语义的操作与操作同步,并具有load-acquire语义。如果操作A 与操作B同步,则表示A 线程间发生在 B之前,这意味着A 发生在之前> B,这意味着A和B不会导致数据竞争。 (同步关系的名称标有重点)
答案 2 :(得分:0)
修改线程之间共享的值时涉及三个问题。首先,在读取或写入值的过程中有可能进行线程切换,结果是某些其他线程可以看到部分写入(即无意义)的值。其次,每个处理器都有自己的数据缓存,因此一个处理器上的一个线程的写入可能对另一个处理器上运行的另一个线程不可见。第三,编译器可以在限制内重新排序指令,以使代码更有效。 std::atomic
消除了所有三种可能性:原子对象的读取和写入不会中断;写入原子类型会将高速缓存刷新到主存储器,从原子类型读取会从主存储器重新加载高速缓存;并且不允许编译器跨原子类型的操作移动指令。这些事情如何完成的细节(包括是否需要完成任何事情)取决于目标平台,但这些都是在标准库的实现中完成的。编辑:哎呀,刚刚注意到这个问题是关于Boost的。我没有挖掘它,但我认为Boost满足与标准库相同的约束,并适当地实现这些约束。