【发布时间】:2015-02-05 09:35:54
【问题描述】:
Swift 中的可变数组不是线程安全的,所以写访问需要同步。是否所有读取也需要如此?具体来说,在不使用锁、串行队列等的情况下,以下线程是否安全(假设在这两种情况下其他线程可能会改变数组):
- 访问可变数组的计数属性
- 将数组传递给函数,或将其分配给变量(假设两者都会复制数组,因为它是一个结构)
【问题讨论】:
标签: arrays multithreading swift thread-safety
Swift 中的可变数组不是线程安全的,所以写访问需要同步。是否所有读取也需要如此?具体来说,在不使用锁、串行队列等的情况下,以下线程是否安全(假设在这两种情况下其他线程可能会改变数组):
【问题讨论】:
标签: arrays multithreading swift thread-safety
有关线程安全的确切细节应由语言指定。目前,Swift 没有这样的规范。甚至没有像“线程”这样的东西。因此,我们应该应用“最坏情况”(例如 C 的行为方式)并应用来自 GCD 和其他可在 Swift 中使用的 C API 的知识。
请注意,某些语言习语可能是线程安全的,只是因为语言和底层工具集本身会处理它,例如当语言构造和当前硬件为其生成代码时,插入对适当内存屏障指令的调用。语言 C(和 C++)在这方面没有为我们做任何事情。
我们努力避免的是“数据竞赛”。当任何线程写入内存位置并且任何其他线程从同一位置读取而不使用显式同步原语时,可能会发生数据竞争。而且,“线程”与我们在 Cocoa 中创建 NSThread 对象时的含义相同。
因此,您的方案是否是线程安全的问题是明确的“不,不是”。您需要的是某种形式的并发控制,例如使用专用的串行调度队列执行对数组的访问(读取和写入),或者将锁与互斥锁(也称为“临界区”)结合使用。
【讨论】: