4

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

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

我想检查我是否正确理解了所有内容。

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

所以有我的陈述,想问一下,如果他们是正确的,如果他们是正确的,什么类型的变量也可以设置或获取没有CRITICAL_SECTION

PS我说的是每个方法获取或设置一个值,不是两个,不是五个,而是一个。

4

4 回答 4

5
  1. 您不需要锁定原子数据,但在内部它们可能会锁定。请注意,例如,C++11std::atomic有一个is_lock_free函数。
  2. bool可能不是原子的。看这里这里
于 2013-08-19T13:53:29.983 回答
4

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

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

(并且没有缓存问题,因为正确对齐的变量始终位于单个缓存行上)。

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

  • 读一个bool?美好的。测试并设置一个bool?更好地使用 InterlockedCompareExchange
  • 覆盖一个整数?伟大的!添加到它?临界区。
于 2013-08-19T15:31:21.350 回答
2

在这里可以找到:

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

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

于 2013-08-19T13:56:16.490 回答
1

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

于 2013-08-19T13:53:46.310 回答