Swift 可变数组线程安全
Swift mutable array thread safety
Swift 中的可变数组不是线程安全的,因此写入访问需要同步。是不是所有的reads也需要如此?具体来说,以下线程在不使用锁、串行队列等的情况下是否安全(假设在这两种情况下其他线程可能会改变数组):
- 访问可变数组的计数 属性
- 将数组传递给函数,或将其分配给变量(假设这两者都将复制数组,因为它是一个结构)
有关线程安全的确切细节应由语言指定。目前,Swift 没有这样的规范。甚至没有 "thread" 这样的东西。因此,我们应该应用 "worst case"(例如 C 的行为方式)并应用来自 GCD 的知识,以及可以在 Swift.
中使用的其他 C API
注意,某些语言习语 可能 是线程安全的,只是因为语言和底层工具集本身会处理它,例如在语言构造需要时插入对适当内存屏障指令的调用,并在为它生成代码时插入对当前硬件的调用。 C 语言(和 C++)在这方面没有为我们做任何事情。
我们努力避免的是"data race"。当任何线程写入内存位置而任何其他线程在不使用显式同步原语的情况下从同一位置读取时,可能会发生数据竞争。并且,将 "thread" 与我们在 Cocoa.
中创建 NSThread 对象时的意思相同
所以,你的场景是否是线程安全的问题很明确"No, it is not."你需要的是某种形式的并发控制,例如使用专用的串行调度队列,您可以在其中执行对数组的访问(读取和写入),或者将锁与互斥锁(也称为 "critical section")结合使用。
Swift 中的可变数组不是线程安全的,因此写入访问需要同步。是不是所有的reads也需要如此?具体来说,以下线程在不使用锁、串行队列等的情况下是否安全(假设在这两种情况下其他线程可能会改变数组):
- 访问可变数组的计数 属性
- 将数组传递给函数,或将其分配给变量(假设这两者都将复制数组,因为它是一个结构)
有关线程安全的确切细节应由语言指定。目前,Swift 没有这样的规范。甚至没有 "thread" 这样的东西。因此,我们应该应用 "worst case"(例如 C 的行为方式)并应用来自 GCD 的知识,以及可以在 Swift.
中使用的其他 C API注意,某些语言习语 可能 是线程安全的,只是因为语言和底层工具集本身会处理它,例如在语言构造需要时插入对适当内存屏障指令的调用,并在为它生成代码时插入对当前硬件的调用。 C 语言(和 C++)在这方面没有为我们做任何事情。
我们努力避免的是"data race"。当任何线程写入内存位置而任何其他线程在不使用显式同步原语的情况下从同一位置读取时,可能会发生数据竞争。并且,将 "thread" 与我们在 Cocoa.
中创建 NSThread 对象时的意思相同所以,你的场景是否是线程安全的问题很明确"No, it is not."你需要的是某种形式的并发控制,例如使用专用的串行调度队列,您可以在其中执行对数组的访问(读取和写入),或者将锁与互斥锁(也称为 "critical section")结合使用。