修复小型原语的竞争条件有多重要?

How important is it to fix race conditions for small primitives?

我正在开发一个 iOS 应用程序,我在我的应用程序中发现了非原子 BOOLNSInteger 属性的一些竞争条件。我很好奇,如果这些得到修复真的很重要吗?就像,如果我同时对 BOOL 进行读取和写入,我不在乎它使用 BOOL 的旧值还是新值,只要它使用其中之一他们,这样不好吗?当写入的 BOOL 的开始和结束值为 0 时,如果读取结果为 1,我会感到惊讶。

这是一场“良性”竞赛,在 WWDC 2016 视频 Thread Sanitizer and Static Analysis(大约 14:40)中进行了讨论。

他们指出,不应将任何种族视为良性种族,因为:

  • 这取决于您使用的特定硬件架构,并且您无法保证这种数据竞争在不同的架构下会继续保持良性;

  • 所有数据竞争(良性或其他)都被认为是 C/C++ 标准中未定义的行为。

  • 虽然这在您的代码中可能不是问题,但编译器可以自由地重新排序指令,而不会理会其他线程可能在做什么,因此在某些情况下,如果没有某种同步机制,它可能会导致“非常微妙的错误”。

最重要的是,尽管修复这些良性竞争可能不是必需的,但 Apple 建议您无论如何都要这样做。幸运的是,由于您正在处理 Objective-C,因此可以通过将属性设置为 atomic.

来轻松补救