现在正在编写复杂的class
并认为我使用了很多CRITICAL_SECTION
。
据我所知,某些类型的原子操作总是在没有任何硬件或软件中断的情况下执行。
我想检查一下我是否理解正确。
CRITICAL_SECTION
因为这样做不会中断。bool
是原子的。所以有我的陈述,想问一下,如果它们是正确的,如果它们是正确的,那么什么类型的变量也可以设置或得到CRITICAL_SECTION
?
P上。 S。我说的是每种方法获得或设置一个单一值,而不是两个,而不是五个,而是一个。
答案 0 :(得分:5)
答案 1 :(得分:4)
注意:此答案适用于Windows,而不是其他平台。
没有InterlockedRead或InterlockedWrite函数;具有正确整数大小(和对齐)的简单读取和写入在Windows上是原子的("Simple reads and writes to properly-aligned 32-bit variables are atomic operations.")。
(并且没有缓存问题,因为正确对齐的变量始终位于单个缓存行上)。
但是,读取和修改这些变量(或任何其他变量)不是原子的:
bool
?精细。测试并设置bool
?更好用
InterlockedCompareExchange。答案 2 :(得分:2)
Here可以找到:
对正确对齐的64位变量进行简单的读写操作 64位Windows上的原子。对64位值的读写不是 保证在32位Windows上是原子的。读取和写入 任何其他大小的变量都不保证是原子的 平台。
结果应正确但在编程时最好不要信任 。由于CPU缓存,仍然存在很小的失败可能性。
答案 3 :(得分:1)
对于bool,
或任何其他类型或大多数操作都是原子的所有实现/平台/编译器,您无法保证。所以,不,我不相信你的陈述是正确的。您可以重新构建逻辑或使用其他方法来建立原子性,但如果您依赖它,则可能无法删除CRITICAL_SECTION
用法。