有人能解释一下这三种原子操作之间的区别吗?
除了我不明白的“使用获取symantecs”之外,我似乎找不到任何关于它们的含义的文档。
谢谢。
发布于 2014-08-25 14:02:20
离开文件,
InterlockedIncrement“为每个呼叫生成一个全记忆屏障”。内存屏障是对CPU的特殊指令,它阻止CPU像通常那样重新排序操作--例如,负载操作可能非常昂贵,因此如果有一系列操作看起来像"add to A,add to A,load B,add to B",CPU将尝试将其重新排序为"load B,add to A,add to A,add to B“,这样B的负载就有时间在需要之前完成。
然而,这会破坏并行程序中的逻辑,因此有时内存障碍是必要的。它们是昂贵的:它们的成本往往相当于缓存丢失的成本。
如果系统支持InterlockedIncrementAcquire,则尝试使用"获取语义“,如果不支持,则返回到InterlockedIncrement。离开那篇博文,
获取语义,防止按程序顺序对读-获取进行任何读或写操作的内存重新排序。
因此,获取语义是一种有限的、成本较低的内存障碍,只有在某些情况下才有用(显然,只有读取时才有用)。
最后,InterlockedIncrementNoFence不生成内存屏障--它完全不受检查,而且可能会导致顺序一致性问题。
https://stackoverflow.com/questions/25487373
复制相似问题