请看下面的例子.

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.

Ios相关问答推荐

为什么导航栏在与Style.Page的选项卡栏一起使用时停止工作?

如何创建具有SPM依赖项的二进制XCFramework?

OnTapGesture在其修改的视图外部触发

iOS 17-在Xcode 15中添加导航控制器时,导航栏不会立即显示

在flutter中使用flatter_screenutil这样的软件包的目的是什么?

在 Swift 中,对象如何被准确地从内存中移除?

SwiftUI 每秒从 Timer 更新单个 @State 属性,每秒也重绘整个视图

SKScene 的更新功能似乎不起作用

Apollo iOS 客户端代码生成:错误:无法查询字段

从远程通知启动时,iOS 应用程序加载错误

Xcode intellisense 彩色框中字母的含义,如 f、T、C、M、P、C、K、# 等

如何阻止图像在 UIImageView 中拉伸?

光标未显示在 UITextView 中

如何在 Swift 中使用包含多个值的查询参数构建一个 URL?

是否可以在 iOS 9 上让您的 iPad 应用退出多任务处理?

命令 /Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang 失败,退出代码为 1

Sierra 中的安全/协同设计: keys 串忽略访问控制设置和 UI 提示权限

使用 Chrome DevTools 调试 iOS 6+7 Mobile Safari

iOS UITextView 或 UILabel 带有可点击的动作链接

如何删除UITableView中最后一个单元格的最后一个边框?