首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCD 4螺纹安全

GCD 4螺纹安全
EN

Stack Overflow用户
提问于 2018-05-26 14:30:39
回答 1查看 1.9K关注 0票数 2

我有一个控制某些资源的函数,例如:

代码语言:javascript
复制
var resource: Int?

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

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

代码语言:javascript
复制
DispatchQueue.global(qos: .userInitiated).async {
    changeSomeResources()
}
DispatchQueue.global(qos: .userInitiated).async {
    changeSomeResources()
}

在这种情况下,除了种族条件之外,我还能得到一些线程问题吗?例如,如果这两个函数同时尝试更改资源

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-26 15:23:12

全局分派队列是并发的,因此不能保护您的函数不被多个线程同时调用。

如果您想序列化对资源的访问,那么必须创建一个串行队列:

代码语言:javascript
复制
let myQueue = DispatchQueue(label: "myQueue", qos: .userInitiated)

然后按顺序执行发送到此队列的所有工作项:

代码语言:javascript
复制
myQueue.async {
    changeSomeResources()
}

还请注意,UIApplication - as是一个与UI相关的资源- must,只能在主线程上访问:

代码语言:javascript
复制
DispatchQueue.main.async {
    // working with UIApplication.shared
}

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50543782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档