现在写复杂的class
,觉得我用了很多CRITICAL_SECTION
。
据我所知,有一些types的primefaces操作,总是执行没有任何硬件或软件中断。
我想检查我是否正确理解一切。
CRITICAL_SECTION
因为这样做不会有中断。 bool
是primefaces的。 所以有我的陈述,要问,如果他们是正确的,如果他们是正确的,什么types的variables也可以设置或得到没有CRITICAL_SECTION
?
PS我正在谈论获取或设置每个方法一个单一的值 ,而不是两个,不是五个,而是一个。
std::atomic
有一个is_lock_free
函数。 bool
可能不是原子的。 看到这里和这里 注意:这个答案适用于Windows,并没有说其他平台。
没有InterlockedRead或InterlockedWrite函数; 使用正确的整数大小(和对齐)进行简单的读写操作在Windows上是原子操作( “对正确对齐的32位变量的简单读写操作是原子操作” )。
(并且没有缓存问题,因为正确对齐的变量总是在一个缓存行上)。
但是, 读取和修改这些变量(或任何其他变量)不是原子的:
bool
? 精细。 测试和设置一个bool
? 更好地使用InterlockedCompareExchange 。 在这里可以找到:
简单的读取和写入正确对齐的64位变量在64位Windows上是原子的。 读取和写入64位值不能保证在32位Windows上是原子的。 读取和写入其他大小的变量不保证在任何平台上都是原子的。
结果应该是正确的,但在编程中最好不要相信应该 。 由于CPU高速缓存,故障的可能性依然很小。
您不能保证bool,
或其他类型或大多数操作都是原子的所有实现/平台/编译器。 所以,不,我不相信你的陈述是正确的。 你可以重新设计你的逻辑或者使用其他方法来建立原子性,但是如果你依赖它,那么你可能无法摆脱只删除CRITICAL_SECTION
用法。