swift 是否有办法取消DispatchQueue并发执行操作?

zbq4xfa0  于 2023-02-18  发布在  Swift
关注(0)|答案(1)|浏览(141)

bounty将在6天后过期。回答此问题可获得+100的声誉奖励。johnbakers正在寻找来自声誉良好来源的答案:希望很好地理解为什么写入时复制不会干扰对不同数组索引的多线程更新,以及从规范的Angular 来看,这样做是否确实安全(看起来是这样)。

是否有办法停止concurrentPerform操作?

let count = arr.count
let group = DispatchGroup()
group.enter()
DispatchQueue.concurrentPerform(iterations: count, execute: { i in
    if stop { group.leave(); return }  // Crashes with EXC_BAD_INSTRUCTION
    // ..
})
group.wait()

经过几次迭代后,EXC_BAD_INSTRUCTION崩溃了。看起来group.leave()没有退出操作。如何退出取消操作?基本上,我试图做的是并发循环一个数组,如果满足某些条件,就中断它,而不使用Objective-C桥来使用并发枚举。

clj7thdc

clj7thdc1#

DispatchQueue.concurrentPerform导致块被执行指定的次数,并等待所有迭代完成。没有办法阻止这种情况。(如果目标队列是并发队列,则块并行运行。)
当然,如果满足某些条件,每个工作项都可以“提前返回”,但这不会影响其他工作项。
您的代码崩溃是因为在调度组上调用leave()的次数多于enter()

相关问题