Swift可变数组线程安全

时间:2015-02-05 09:35:55

标签: arrays multithreading swift thread-safety

Swift中的可变数组不是线程安全的,因此需要同步写访问。是否还需要所有读取?具体来说,以下线程是安全的,不使用锁,串行队列等(假设在这两种情况下其他线程可能会改变数组):

  1. 访问可变数组的count属性
  2. 将数组传递给函数,或将其分配给变量(假设两者都将复制数组,因为它是结构)

1 个答案:

答案 0 :(得分:3)

应该用语言指定有关线程安全的确切细节。目前,Swift没有这样的规范。甚至没有像“线程”这样的东西。因此,我们应该应用“最坏情况”(例如C将如何表现)并应用来自GCD的这些知识,以及可以在Swift中使用的其他C API。

请注意,某些语言习惯用法可能只是因为语言和底层工具集本身可以处理它,因此是线程安全的。在语言构造需要时插入适当的内存屏障指令,并在为其生成代码时插入当前硬件。语言C(和C ++)代表我们在这方面没有任何作用。

我们努力避免的是“数据竞赛”。当任何线程写入内存位置并且任何其他线程从同一位置读取而不使用显式同步原语时,可能发生数据争用。并且,将“线程”视为在Cocoa中创建NSThread对象时的意思。

所以,你的问题是你的场景是否是线程安全的是一个明确的“不,它不是。”你需要的是某种形式的并发控制,例如:使用专用的串行调度队列来执行对数组的访问(读写),或者将锁与互斥锁(又称“临界区”)结合使用。