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

时间:2017-08-12 18:02:37

标签: swift multithreading

如何锁定变量并阻止不同的线程同时更改它,这会导致错误?

我尝试使用

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

但我仍然有多线程问题。

2 个答案:

答案 0 :(得分:3)

共享价值

如果您想要以类似此方式的线程安全方式访问共享对象

var list:[Int] = []

DispatchQueue

您可以创建自己的序列DispatchQueue

let serialQueue = DispatchQueue(label: "SerialQueue")

Dispatch Synch

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

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

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

  

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

派遣Asynch

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

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。方法的选择取决于您正在撰写的内容的其他方面 - 线程需要考虑很多。

你能提供一个让你失败的特定简单例子吗?