CRITICAL_SECTION用于设置和获取单个bool值

时间:2013-08-19 13:47:29

标签: c++ c windows multithreading winapi

现在正在编写复杂的class并认为我使用了很多CRITICAL_SECTION

据我所知,某些类型的原子操作总是在没有任何硬件或软件中断的情况下执行。

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

  • 要设置或获得原子价值,我们不需要CRITICAL_SECTION因为这样做不会中断。
  • bool是原子的。

所以有我的陈述,想问一下,如果它们是正确的,如果它们是正确的,那么什么类型的变量也可以设置或得到CRITICAL_SECTION

P上。 S。我说的是每种方法获得或设置一个单一值,而不是两个,而不是五个,而是一个。

4 个答案:

答案 0 :(得分:5)

  1. 您不需要锁定原子数据,但在内部它们可能会锁定。请注意,例如,C ++ 11的std::atomic具有is_lock_free函数。
  2. bool可能不是原子的。请参阅herehere

答案 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用法。