Swift - 分派到主队列是不是足以使 var 线程安全?

Posted

技术标签:

【中文标题】Swift - 分派到主队列是不是足以使 var 线程安全?【英文标题】:Swift - Is dispatching to the main queue enough to make a var thread safe?Swift - 分派到主队列是否足以使 var 线程安全? 【发布时间】:2015-06-18 07:01:50 【问题描述】:

谈到同步解决方案,我知道有很多东西可以用来确保 var 线程安全。但我的问题是: 由于主队列是串行的,因此向其分派是否足以使 var 对异步读/写操作安全? 假设我有一个 Int 数组:

var myArr: [Int] = []

每当我需要更新它时,我都会使用主队列:

let newVal = 123

dispatch_async(dispatch_get_main_queue(),  () -> Void in
    myArr.append(newVal)
)

每当我需要阅读时:

dispatch_async(dispatch_get_main_queue(),  () -> Void in
    println(myArr.count)
)

这足以使 myArr 线程安全吗?

【问题讨论】:

您确定要异步读取该值吗?在您的代码中,您只能在完成块内使用myArr.count 嗯,这只是一个例子,用来说明我的问题。在我的实际项目中,数组将通过来自 javascriptCore 的回调进行访问和写入,这意味着它必须是异步的,我需要确保每当这些请求到达时,它们都会以正确的顺序执行并且不会发生冲突。 也许您可以为您的问题添加更具体的代码,特别是回调如何读取数组值。 【参考方案1】:

是的,这就够了。只要您从同一个串行队列中读取和写入,您就是安全的。

【讨论】:

以上是关于Swift - 分派到主队列是不是足以使 var 线程安全?的主要内容,如果未能解决你的问题,请参考以下文章

JMS 主题与队列 - 意图

如何从 Swift 中的主线程中关闭

将多个单独的 Swift 文件加载到主容器视图中

Combine 的 receive(on:) 没有分派到串行队列,导致数据竞争

如何将链式作业分派到 Lumen 6 中的队列?

使用“sync”分派到队列和使用带有“.wait”标志的工作项之间的区别?