【发布时间】:2018-06-19 06:18:52
【问题描述】:
我在Arrays 中阅读了关于Copy-on-Write 优化概念以及Swift 中的其他数据结构。
我想知道的是Copy-on-Write如何在多线程环境中工作。
let arr1 = [1, 2, 3, 4]
let arr2 = arr1
arr1.withUnsafeBytes { print("arr1:", $0.baseAddress) } //0x000060000007ee60
arr2.withUnsafeBytes { print("arr2:", $0.baseAddress) } //0x000060000007ee60
DispatchQueue.global(qos: .default).async {
let arr3 = arr1
arr3.withUnsafeBytes { print("arr3:", $0.baseAddress) } //0x000060000007ee60
}
在上面的代码中,arr1 和 arr2 最初具有与 copy-on-write 中预期的相同的地址。但是,arr3 也与 arr1 和 arr2 共享相同的内存,尽管它在不同的线程上执行。
据我所知,每个线程都有不同的堆栈分配。那为什么arr3 还在同一个位置呢?
谁能解释一下它是如何工作的。
【问题讨论】:
-
let arr3 = arr1使两个数组(最初)共享元素存储——为什么在哪个线程上执行代码很重要?顺便说一句,元素存储是分配内存的,即在堆上,而不是在堆栈上。 -
@MartinR 元素存储不取决于它是什么类型的元素吗?
-
我不确定您的意思以及这与问题有何关系。数组是一个(固定大小的)struct,带有一个指向(分配的)元素存储的指针。 – 看看mikeash.com/pyblog/…,其中包含 COW 的 Array 类型被“重新发明”,这可能会提供一些见解。
标签: ios arrays swift copy-on-write ios-multithreading