【问题标题】:How important is it to fix race conditions for small primitives?修复小型原语的竞争条件有多重要?
【发布时间】:2017-06-09 04:47:12
【问题描述】:

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

【问题讨论】:

  • 除了特定实现的细节之外,这个问题不太可能有一个合理的一般性答案。
  • 我已经澄清这是一个 iOS 特有的问题
  • 这并没有真正澄清任何事情。您基本上是在问“在某些情况下,某些竞争条件是否重要,除了您之外没有人可以检查”。谁知道?
  • 另一种提出这个问题的方式,因为您似乎没有仔细阅读它,如果开始和结束值相同,并发读取是否保证获得该值?
  • 我的感觉是,如果你发现了一个问题,你应该在它咬你之前解决它。从 2017 年开始使用 Xcode 9 进行 Wwdc 视频 404 调试有大约 10 分钟接近尾声,专门介绍 Xcode 9 如何为您识别竞争条件。他们显然很重视。

标签: ios thread-safety atomic


【解决方案1】:

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

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

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

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

  • 1234563非常微妙的错误。”

归根结底,尽管修复这些良性竞争可能不是必需的,但 Apple 建议您无论如何都这样做。幸运的是,由于您使用的是 Objective-C,因此可以通过设置属性 atomic 轻松解决此问题。

【讨论】:

  • 我同意 Rob 的观点。我的感觉是,如果你发现了一个问题,你应该在它咬你之前解决它。从 2017 年开始使用 Xcode 9 进行 Wwdc 视频 404 调试有大约 10 分钟接近尾声,专门介绍 Xcode 9 如何为您识别竞争条件。他们显然很重视。
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 2015-06-27
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
相关资源
最近更新 更多