gpt4 book ai didi

ios - Swift 数组在多线程环境中写入时复制

转载 作者:搜寻专家 更新时间:2023-10-30 22:00:07 32 4
gpt4 key购买 nike

Swift 数组是在写入时复制的值类型。如果原始数组未发生变化,则“副本”指向相同的内存位置。

假设我们有一个类被多个线程引用

class Foo {
var numbers: [Int] = [1, 2, 3]
}
let foo = Foo()

如果线程 A“复制”numbers

var numbers = foo.numbers

然后线程 B 将 numbers 替换为不同的数组实例

foo.numbers = [4, 5, 6]
当线程 B 试图访问它的元素?

最佳答案

var numbers = foo.numbers 将始终包含 [1, 2, 3] 直到您修改 var numbers

let foo = Foo()
// Thread A
var numbers = foo.numbers

// Thread b
foo.numbers = [4, 5, 6]

// Thread A again - 'var numbers' still has a "reference" to [1, 2, 3]
print(numbers) // "[1, 2, 3]"

我认为您误解了 swift 中的结构如何充当值类型。重新分配 foo.numbers 时,原始 [1, 2, 3] 数组不会被覆盖。

例子

假设您有 10 个线程,所有线程都“复制”foo.numbers,此时数组的内存未被复制。

var myTheadNumbers = foo.numbers

假设线程 1 修改了数组

myThreadNumbers.append(4)

[1, 2, 3] 被复制到一个新数组,然后通过附加 4 对其进行修改。

线程 1 现在拥有它自己的单个 [1, 2, 3, 4] 数组,而线程 2-10 仍然共享原始的 [1, 2, 3]。这就是写时复制对结构的意义 - 当您修改结构并且其他人有旧副本时,您只会因复制而受到性能影响。

这 10 个线程中的每一个都表现得好像它们拥有自己的 [1, 2, 3] 副本,这就是值类型的含义。

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

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