gpt4 book ai didi

arrays - 迭代时从数组中删除项目的安全方法?

转载 作者:搜寻专家 更新时间:2023-11-01 06:01:31 24 4
gpt4 key购买 nike

我有一组闭包,我想以安全的方式执行并删除每一项。

如果我只是这样做:

array.forEach { $0() }
array.removeAll()

有可能某个项目在 forEachremoveAll 执行之间偷偷摸摸,所以我可能会删除在上一行中未执行的元素.

这样会更安全吗?

extension Array {

mutating func removeEach(handler: @escaping (Element) -> Void) {
enumerated().forEach { handler(remove(at: $0.offset)) }
}
}

有没有安全的方法以算法方式而不是使用线程锁来做到这一点?

最佳答案

首先,我假设这里的 array 是一个属性(否则这个问题没有多大意义)。其次,我假设 array 已经是线程安全的。也许是这样的,它提供了数组级别的同步访问。

class Container {
let arrayQueue = DispatchQueue(label: "arrayQueue", attributes: .concurrent)
var _array: [() -> Void] = []
var array: [() -> Void] {
get {
return arrayQueue.sync { return _array }
}
set {
arrayQueue.async(flags: .barrier) {
self._array = newValue
}
}
}
}

使用那种系统,您可以创建一个清除数组的原子执行器:

func execute() {
arrayQueue.async(flags: .barrier) {
// Make a local copy of the array
let toExecute = self._array

// Clear the array (we have a barrier, so there's no race condition)
self._array.removeAll()

// async to another queue to avoid blocking access while executing
DispatchQueue.global().async {
for closure in toExecute {
closure()
}
}
}
}

(你提到过“不使用线程锁”。你几乎不应该在 Swift 中使用线程锁。这就是 GCD 的用途,它做了很多工作来避免锁定,所以你不必这样做。如果你目标是在不使用 GCD 的情况下执行此操作,那么不,如果没有某种并发系统,就无法从多个线程安全地改变属性,而 Swift 的最佳并发系统是 GCD。)

关于arrays - 迭代时从数组中删除项目的安全方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48708773/

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