在 Swift 中,我们可以利用DispatchQueue
来防止竞争条件。通过使用串行队列,所有事情都按顺序执行,来自https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
串行队列(也称为私有调度队列)按添加到队列的顺序一次执行一项任务。当前正在执行的任务在由调度队列管理的不同线程上运行(可能因任务而异)。串行队列通常用于同步对特定资源的访问。
但是我们可以很容易地制造死锁如何在 Grand Central Dispatch 中制造死锁?通过执行sync
内部async
let serialQueue = DispatchQueue(label: "Cache.Storage.SerialQueue")
serialQueue.async {
serialQueue.sync {
print("perform some job")
}
print("this can't be reached")
}
防止死锁的唯一方法是使用 2 个串行队列,每个用于sync
和async
函数版本。但这可能会在同时发生时导致罕见writeSync
的情况。writeAsync
我在fs 模块中看到它同时支持sync
和async
功能,例如fs.writeFileSync(file, data[, options])
和fs.writeFile(file, data[, options], callback)
。通过允许两个版本,这意味着用户可以按照他们想要的任何顺序使用它们?所以他们可以像我们上面所做的那样轻松创建死锁?
所以也许fs
有一个聪明的方法可以应用到 Swift 上?我们如何以线程安全的方式sync
同时支持这两者?async