Swift 多线程环境中的写时复制
Copy-on-Write in Multi-threaded environment in Swift
我读过 写时复制 优化概念 Arrays
和 Swift
中的其他数据结构。
我想知道的是写时复制如何在多线程环境中工作。
let arr1 = [1, 2, 3, 4]
let arr2 = arr1
arr1.withUnsafeBytes { print("arr1:", [=11=].baseAddress) } //0x000060000007ee60
arr2.withUnsafeBytes { print("arr2:", [=11=].baseAddress) } //0x000060000007ee60
DispatchQueue.global(qos: .default).async {
let arr3 = arr1
arr3.withUnsafeBytes { print("arr3:", [=11=].baseAddress) } //0x000060000007ee60
}
在上面的代码中,arr1
和 arr2
最初的地址与 copy-on-write
中预期的相同。但是,arr3
也与 arr1
和 arr2
共享相同的内存,尽管它在不同的线程上执行。
据我所知,每个线程都有不同的堆栈分配。那为什么 arr3
仍然共享同一个位置?
谁能解释一下它是如何工作的。
您没有查看数组的地址。您正在查看阵列的内部后备存储地址,该地址是共享的和堆分配的。
如果你想查看堆栈分配数组容器的地址(指向后备存储的部分),那么你的意思是:
var arr1 = [1, 2, 3, 4]
var arr2 = arr1
withUnsafePointer(to: &arr1) { print("arr1:", [=10=]) }
withUnsafePointer(to: &arr2) { print("arr2:", [=10=]) }
DispatchQueue.global(qos: .default).async {
let arr3 = arr1
withUnsafePointer(to: arr3) { print("arr3:", [=10=]) }
}
// =>
arr1: 0x0000000122d671e0 // local stack
arr2: 0x0000000122d671e8 // local stack (next address)
arr3: 0x0000700000e48d10 // heap
我相信这就是您所期望的结果。
我读过 写时复制 优化概念 Arrays
和 Swift
中的其他数据结构。
我想知道的是写时复制如何在多线程环境中工作。
let arr1 = [1, 2, 3, 4]
let arr2 = arr1
arr1.withUnsafeBytes { print("arr1:", [=11=].baseAddress) } //0x000060000007ee60
arr2.withUnsafeBytes { print("arr2:", [=11=].baseAddress) } //0x000060000007ee60
DispatchQueue.global(qos: .default).async {
let arr3 = arr1
arr3.withUnsafeBytes { print("arr3:", [=11=].baseAddress) } //0x000060000007ee60
}
在上面的代码中,arr1
和 arr2
最初的地址与 copy-on-write
中预期的相同。但是,arr3
也与 arr1
和 arr2
共享相同的内存,尽管它在不同的线程上执行。
据我所知,每个线程都有不同的堆栈分配。那为什么 arr3
仍然共享同一个位置?
谁能解释一下它是如何工作的。
您没有查看数组的地址。您正在查看阵列的内部后备存储地址,该地址是共享的和堆分配的。
如果你想查看堆栈分配数组容器的地址(指向后备存储的部分),那么你的意思是:
var arr1 = [1, 2, 3, 4]
var arr2 = arr1
withUnsafePointer(to: &arr1) { print("arr1:", [=10=]) }
withUnsafePointer(to: &arr2) { print("arr2:", [=10=]) }
DispatchQueue.global(qos: .default).async {
let arr3 = arr1
withUnsafePointer(to: arr3) { print("arr3:", [=10=]) }
}
// =>
arr1: 0x0000000122d671e0 // local stack
arr2: 0x0000000122d671e8 // local stack (next address)
arr3: 0x0000700000e48d10 // heap
我相信这就是您所期望的结果。