请看下面的例子.
DispatchQueue的suspend()方法从主线程调用.而resume()方法是从后台线程调用的.这样安全吗
我已经阅读了DispatchObject的文档,但它没有说明是否可以从后台线程调用Suspend/Resume方法.
谢谢你的阅读.
let queue = DispatchQueue(label: "MyQueue")
queue.suspend()
Task {
queue.resume() // <-- Is it okay?
}
请看下面的例子.
DispatchQueue的suspend()方法从主线程调用.而resume()方法是从后台线程调用的.这样安全吗
我已经阅读了DispatchObject的文档,但它没有说明是否可以从后台线程调用Suspend/Resume方法.
谢谢你的阅读.
let queue = DispatchQueue(label: "MyQueue")
queue.suspend()
Task {
queue.resume() // <-- Is it okay?
}
通常情况下,将SWIFT并发性和GCD混合在一起不是一个好主意,@lorem ipsum正确地认为Task
并不意味着"后台线程".在许多情况下,您应该希望它位于同一线程上(因为它继承了所编写的当前任务上下文).不过,这并不会真正影响问题,只会影响您的示例.
答案绝对是肯定的.如果我能找到这样一条明确的语句,那就好了:"除非另有说明,否则每个分派调用都是线程安全的"(这是真的),但我还没能找到这么广泛的语句.最接近的是statement:
调度队列本身是线程安全的.换句话说,您可以从系统上的任何线程将任务提交到调度队列,而无需首先锁定或同步对队列的访问.
此外,如果GCD不是几乎完全线程安全的,那么它基本上就不能用于其目的.在并发库中,当某个东西是not线程安全时,您应该期待文档调用.
但是,虽然我在文档中找不到令人满意的通用声明,但libDispatch是开放源码的,我们可以查看.我们想要的函数是_dispatch_lane_resume
,不出所料,它将所有工作包装在对os_atomic_rmw_loop2o
的调用中,这是一个wrapper around os_atomic_load
and os_atomic_cmpxchgvw
.