gpt4 book ai didi

ios - Swift 多线程环境中的写时复制

转载 作者:搜寻专家 更新时间:2023-10-31 22:09:46 25 4
gpt4 key购买 nike

我读过有关 Copy-on-Write 优化ArraysSwift 中其他数据结构的概念。

我想知道的是 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
}

在上面的代码中,arr1arr2 最初具有与 copy-on-write 预期相同的地址。但是,arr3 也与 arr1arr2 共享相同的内存,尽管它在不同的线程上执行。

据我所知,每个线程都有不同的堆栈分配。那为什么 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

我相信这就是您所期望的结果。

关于ios - Swift 多线程环境中的写时复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50921749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com