GCD swift 4线程安全

时间:2018-05-26 14:30:39

标签: swift grand-central-dispatch

我有一个控制某些资源的功能,例如:

var resource: Int?

func changeSomeResources() {
    resource = 1
    // rewriting keychain parameters
    // working with UIApplication.shared
}

然后我多次将此函数添加到全局线程

DispatchQueue.global(qos: .userInitiated).async {
    changeSomeResources()
}
DispatchQueue.global(qos: .userInitiated).async {
    changeSomeResources()
}

除了竞争条件外,我可以在这种情况下遇到一些线程问题吗? 例如,如果两个函数都试图同时更改资源

1 个答案:

答案 0 :(得分:4)

全局调度队列是并发,,因此无法保护 从多个线程同时调用你的函数。

如果您想序列化对资源的访问权限,那么您必须这样做 创建串行队列:

UIApplication

然后,按顺序执行调度到此队列的所有工作项:

DispatchQueue.main.async {
    // working with UIApplication.shared
}

另请注意,In [1]: data Out[1]: Name item Wk1 price Wk2 price Wk1 units Wk2 units Vehicle Car 978 966 100 120 - 仅作为UI相关资源 - 必须 可以在主线程上访问:

In [2]: data.melt(id_vars = ['Name', 'item'])
Out[2]: 
      Name item   variable  value
0  Vehicle  Car  Wk1 price    978
1  Vehicle  Car  Wk2 price    966
2  Vehicle  Car  Wk1 units    100
3  Vehicle  Car  Wk2 units    120

Xcode还有“Thread Sanitizer”和“主线程检查器”选项 (在方案设置的“诊断”窗格中)可以提供帮助 检测线程问题。