如何锁定变量并阻止不同的线程同时更改它,这会导致错误?
我尝试使用
func lock(obj: AnyObject, blk:() -> ()) {
objc_sync_enter(obj)
blk()
objc_sync_exit(obj)
}
但我仍然有多线程问题。
答案 0 :(得分:3)
如果您想要以类似此方式的线程安全方式访问共享对象
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
答案 1 :(得分:0)
Swift的并发支持还没有。听起来它可能会在Swift 5中得到一点发展。一篇优秀的文章是Matt Gallagher's Mutexes and Closure Capture in Swift,它会查看各种解决方案,但建议使用pthread_mutex_t。方法的选择取决于您正在撰写的内容的其他方面 - 线程需要考虑很多。
你能提供一个让你失败的特定简单例子吗?