修复小型原语的竞争条件有多重要?
How important is it to fix race conditions for small primitives?
我正在开发一个 iOS 应用程序,我在我的应用程序中发现了非原子 BOOL
和 NSInteger
属性的一些竞争条件。我很好奇,如果这些得到修复真的很重要吗?就像,如果我同时对 BOOL
进行读取和写入,我不在乎它使用 BOOL
的旧值还是新值,只要它使用其中之一他们,这样不好吗?当写入的 BOOL
的开始和结束值为 0 时,如果读取结果为 1,我会感到惊讶。
这是一场“良性”竞赛,在 WWDC 2016 视频 Thread Sanitizer and Static Analysis(大约 14:40)中进行了讨论。
他们指出,不应将任何种族视为良性种族,因为:
这取决于您使用的特定硬件架构,并且您无法保证这种数据竞争在不同的架构下会继续保持良性;
所有数据竞争(良性或其他)都被认为是 C/C++ 标准中未定义的行为。
虽然这在您的代码中可能不是问题,但编译器可以自由地重新排序指令,而不会理会其他线程可能在做什么,因此在某些情况下,如果没有某种同步机制,它可能会导致“非常微妙的错误”。
最重要的是,尽管修复这些良性竞争可能不是必需的,但 Apple 建议您无论如何都要这样做。幸运的是,由于您正在处理 Objective-C,因此可以通过将属性设置为 atomic
.
来轻松补救
我正在开发一个 iOS 应用程序,我在我的应用程序中发现了非原子 BOOL
和 NSInteger
属性的一些竞争条件。我很好奇,如果这些得到修复真的很重要吗?就像,如果我同时对 BOOL
进行读取和写入,我不在乎它使用 BOOL
的旧值还是新值,只要它使用其中之一他们,这样不好吗?当写入的 BOOL
的开始和结束值为 0 时,如果读取结果为 1,我会感到惊讶。
这是一场“良性”竞赛,在 WWDC 2016 视频 Thread Sanitizer and Static Analysis(大约 14:40)中进行了讨论。
他们指出,不应将任何种族视为良性种族,因为:
这取决于您使用的特定硬件架构,并且您无法保证这种数据竞争在不同的架构下会继续保持良性;
所有数据竞争(良性或其他)都被认为是 C/C++ 标准中未定义的行为。
虽然这在您的代码中可能不是问题,但编译器可以自由地重新排序指令,而不会理会其他线程可能在做什么,因此在某些情况下,如果没有某种同步机制,它可能会导致“非常微妙的错误”。
最重要的是,尽管修复这些良性竞争可能不是必需的,但 Apple 建议您无论如何都要这样做。幸运的是,由于您正在处理 Objective-C,因此可以通过将属性设置为 atomic
.