使用 GCD 在 Swift 3 中安全地锁定变量



如何锁定变量并防止不同的线程同时更改它,从而导致错误?

我试过使用

func lock(obj: AnyObject, blk:() -> ()) {
objc_sync_enter(obj)
blk()
objc_sync_exit(obj)
}

但我仍然有多线程问题。

共享值

如果您有一个共享值,您希望以像这样的线程安全方式访问该值

var list:[Int] = []

调度队列

您可以创建自己的串行DispatchQueue

let serialQueue = DispatchQueue(label: "SerialQueue")

调度同步

现在不同的线程可以安全地访问list,你只需要将代码写入调度到你的串行队列的闭包中。

serialQueue.sync {
// update list <---
}
// This line will always run AFTER the closure on the previous line 👆👆👆

由于串行队列一次执行一个闭包,因此对list的访问将是安全的。

请注意,前面的代码将阻塞当前线程,直到执行闭包。

调度异步

如果在串行队列处理闭包之前不想阻塞当前线程,则可以异步调度闭包

serialQueue.async {
// update list <---
}
// This line can run BEFORE the closure on the previous line 👆👆👆

Swift 的并发支持还没有。听起来它可能在 Swift 5 中开发了一些。 一篇优秀的文章是 Matt Gallagher 的 Mutexes and Closure Capture in Swift,它研究了各种解决方案,但建议pthread_mutex_t。 方法的选择取决于您正在编写的内容的其他方面 - 线程有很多需要考虑。

你能提供一个让你失望的具体简单例子吗?

最新更新