CRITICAL_SECTION设置并获得单一的bool值

现在写复杂的class ,觉得我用了很多CRITICAL_SECTION

据我所知,有一些types的primefaces操作,总是执行没有任何硬件或软件中断。

我想检查我是否正确理解一切。

  • 设置或获取primefaces值,我们不需要CRITICAL_SECTION因为这样做不会有中断。
  • bool是primefaces的。

所以有我的陈述,要问,如果他们是正确的,如果他们是正确的,什么types的variables也可以设置或得到没有CRITICAL_SECTION

PS我正在谈论获取或设置每个方法一个单一的值 ,而不是两个,不是五个,而是一个。

  1. 你不需要锁定原子数据,但内部可能会锁定。 注意例如,C ++ 11的std::atomic有一个is_lock_free函数。
  2. bool可能不是原子的。 看到这里和这里

注意:这个答案适用于Windows,并没有说其他平台。

没有InterlockedRead或InterlockedWrite函数; 使用正确的整数大小(和对齐)进行简单的读写操作在Windows上是原子操作( “对正确对齐的32位变量的简单读写操作是原子操作” )。

(并且没有缓存问题,因为正确对齐的变量总是在一个缓存行上)。

但是, 读取和修改这些变量(或任何其他变量)不是原子的:

  • 读一个bool ? 精细。 测试和设置一个bool ? 更好地使用InterlockedCompareExchange 。
  • 覆盖整数? 大! 添加到它? 关键部分。

在这里可以找到:

简单的读取和写入正确对齐的64位变量在64位Windows上是原子的。 读取和写入64位值不能保证在32位Windows上是原子的。 读取和写入其他大小的变量不保证在任何平台上都是原子的。

结果应该是正确的,但在编程中最好不要相信应该 。 由于CPU高速缓存,故障的可能性依然很小。

您不能保证bool,或其他类型或大多数操作都是原子的所有实现/平台/编译器。 所以,不,我不相信你的陈述是正确的。 你可以重新设计你的逻辑或者使用其他方法来建立原子性,但是如果你依赖它,那么你可能无法摆脱只删除CRITICAL_SECTION用法。