PGD*_*Dev 3 arrays copy-on-write ios swift ios-multithreading
我已经阅读了有关在中进行优化Arrays和其他数据结构的写时复制概念Swift。
我想知道的是写时复制在多线程环境中如何工作。
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
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,arr1并且arr2最初具有与中期望的相同的地址copy-on-write。不过,arr3成也共享相同的存储arr1和arr2虽然是在不同的线程执行。
据我所知,每个线程都有不同的堆栈分配。那为什么arr3仍然共享相同的位置?
有人可以解释一下它是如何工作的。
您不是在查看数组的地址。您正在查看阵列的内部后备存储的地址,该地址是共享的并且是堆分配的。
如果要查看堆栈分配的数组容器(指向后备存储的部分)的地址,则意味着:
var arr1 = [1, 2, 3, 4]
var arr2 = arr1
withUnsafePointer(to: &arr1) { print("arr1:", $0) }
withUnsafePointer(to: &arr2) { print("arr2:", $0) }
DispatchQueue.global(qos: .default).async {
let arr3 = arr1
withUnsafePointer(to: arr3) { print("arr3:", $0) }
}
// =>
arr1: 0x0000000122d671e0 // local stack
arr2: 0x0000000122d671e8 // local stack (next address)
arr3: 0x0000700000e48d10 // heap
Run Code Online (Sandbox Code Playgroud)
我相信这是您所期望的那种结果。
| 归档时间: |
|
| 查看次数: |
269 次 |
| 最近记录: |