如何锁定变量并防止不同的线程同时更改它,从而导致错误?
我试过使用
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。 方法的选择取决于您正在编写的内容的其他方面 - 线程有很多需要考虑。
你能提供一个让你失望的具体简单例子吗?