如何在主队列上同步调度而不发生死锁?

2024-01-10

我需要在主队列上同步调度一个块。我不知道我当前是否在主线程上运行。天真的解决方案如下所示:

dispatch_sync(dispatch_get_main_queue(), block);

但是,如果我当前位于主队列上运行的块内,则此调用会造成死锁。 (同步调度等待块完成,但该块甚至没有开始运行,因为我们正在等待当前块完成。)

显而易见的下一步是检查当前队列:

if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
    block();
} else {
    dispatch_sync(dispatch_get_main_queue(), block);
}

这可行,但很丑。在我至少将其隐藏在某些自定义函数后面之前,是否有更好的解决方案来解决这个问题?我强调,我无法承担异步分派块的费用 - 应用程序处于异步分派块执行“太晚”的情况。


我需要在我的 Mac 和 iOS 应用程序中经常使用类似的东西,所以我使用以下辅助函数(最初在这个答案 https://stackoverflow.com/a/5226271/19679):

void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
    if ([NSThread isMainThread])
    {
        block();
    }
    else
    {
        dispatch_sync(dispatch_get_main_queue(), block);
    }
}

您通过以下方式致电

runOnMainQueueWithoutDeadlocking(^{
    //Do stuff
});

这几乎就是您上面描述的过程,我已经与其他几位开发人员交谈过,他们为自己独立制作了类似的东西。

I used [NSThread isMainThread]而不是检查dispatch_get_current_queue(),因为该函数的注意事项部分 http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_get_current_queue.3.html曾经警告不要使用它进行身份测试和该调用在 iOS 6 中已被弃用 https://stackoverflow.com/questions/13237417/alternatives-to-dispatch-get-current-queue-for-completion-blocks-in-ios-6.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在主队列上同步调度而不发生死锁? 的相关文章

随机推荐

  • 为什么我永远不应该使用不安全的块来修改字符串?

    我有一个字符串 我想以某种方式修改它 例如 反转或大写 我发现最快的方法是使用不安全的块和指针 例如 unsafe fixed char str text str X 有什么理由让我永远不应该这样做吗 Net 框架要求字符串是不可变的 由于
  • 自定义 Seaborn histplot 子图中的图例

    我正在尝试生成一个包含 4 个子图的图形 每个子图都是 Seaborn 直方图 图形定义线为 fig axes plt subplots 2 2 figsize 6 3 7 sharex True sharey True ax1 ax2 a
  • 训练 Tesseract 特定单词 - 可能吗?

    我想使用 Tesseract 从文档中提取大约 10 20 个关键字 该文档将包含所有英文字符 单词 我感兴趣的是 年龄 23 之类的东西 这里 Age 是我感兴趣的关键字 也想提取 23 它的值 我想到的第一个方法是将整个页面提取为文本
  • 多边形轮廓上的边并不总是正确的

    我使用下面的算法来生成四边形 然后将其渲染以形成如下所示的轮廓 http img810 imageshack us img810 8530 uhohz png http img810 imageshack us img810 8530 uh
  • Python 从并行目录导入模块

    我将如何组织我的 python 导入 以便我可以拥有这样的目录 project init py src init py classes py test init py tests py 然后在 project test tests py 中
  • 完成所有登录过程后如何获取ExternalIdentity?

    我正在使用 MVC 5 我可以使用 Google 成功登录 我想在登录过程后访问用户的外部身份声明 例如 我想在视图中访问用户的声明 图片 但是 如果我尝试运行此代码 它总是返回 null 登录过程中除外 自动生成 mvc 模板代码 有没有
  • 解构赋值默认值[重复]

    这个问题在这里已经有答案了 我正在学习 javascript 在解构时尝试为变量提供默认值时 我有点受困于 ES6 语法 基本上 我试图分配一个变量 为其提供对象属性的值 如果该值为 false null undefined 我希望它是一个
  • 按组选择前 N 个值

    这是为了回应r help 邮件列表上提出的问题 http r 789695 n4 nabble com top 10 n values for each classes tt4658074 html a4658095 这里有lots示例数
  • 如何使用 gmail api 和 chrome 扩展将 gmail 保存为 .eml 文件? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 gmail api 的新手 正在开发 chrome 扩展 它将选定的电子邮件保存为 eml 或 msg 文件 我已成功获取当前
  • 显示最初隐藏的无模型对话框

    我有无模型的子对话框 在资源属性中 可见标志设置为 true 根据我在资源属性中的要求 可见标志应该为 true 我想在最初显示时以编程方式隐藏对话框 我重写了 presubclasswindow 并使用下面的代码删除了 WS VISIBL
  • 是否有一个 SaxParser 可以读取 json 并触发事件,使其看起来像 xml

    这会很棒 因为它允许我的 xml 内容读取 json 除了不同的 sax 解析器之外 无需任何更改 如果您的意思是基于事件的解析器 那么有几个项目可以做到这一点 http code google com p json simple http
  • 在Visual Studio中设置添加类快捷键

    我曾经使用快捷键 Ctrl Shift C 在 Visual Studio 2015 中添加一个新类 当我使用另一台机器时 这似乎已经消失了 我该如何设置这个 我查看了 选项 gt 环境 gt 键盘 但看不到任何明显的东西 导航Tools
  • 如何获取箱子尺寸的总重量,例如12 x 160g 等于 1.92kg

    不确定这是否可能 但是 假设我在表中有这样的列 12 x 60g 12 x 160g 500g 1kg 1kg 12 x 160g 12 x 250g 有些是单独尺寸 有些是外壳尺寸 是否可以获得每行的总重量 如果是的话 会怎样做呢 e g
  • 通过键盘将焦点移至 Visual Studio 2008/Visual Studio 2010 中的下一个选项卡组?

    是否可以使用键盘移至 Visual Studio 2008 或 2010 中的下一个垂直选项卡组 有一些命令可将活动窗口移动到下一个或上一个选项卡组 但我找不到用于将焦点从一个选项卡组移动到下一个选项卡组的命令 我发现的唯一解决方法是使用
  • android studio 0.8.14 beta 不支持 Path.approximate()

    渲染问题 不支持 Path approximate 解析文件失败 sdk platforms android 21 data res drawable progress medium material xml添加后出错ProgressBar
  • ActiveRecord::Base.connection.execute 受影响的行

    在 Rails 4 1 1 中 使用 mysql2 适配器 我正在使用 ActiveRecordconnection http apidock com rails ActiveRecord Base connection在 MySQL 表中
  • numpy.asarray:如何检查其结果数据类型是否为数字?

    我必须创建一个numpy ndarray来自具有 int float 或复数的类似数组的数据 我希望能做到numpy asarray功能 我不想给它一个严格的dtype参数 因为我想将复数值转换为complex64 or complex12
  • Mysql 使用日期数据行 ORDER BY

    我有一个这样的查询 SELECT title desc date FROM tablename ORDER BY date ASC title ASC 当数据确实有日期时 效果很好 问题是 日期提交是可选的 因此我有时会得到 0000 00
  • IIS 上的 django-wkhtmltopdf:[WinError 6] 句柄无效

    这是我的第一个问题 所以如果我忘记了要提及的内容或者有什么问题 请原谅我 我在 IIS 10 Windows Server 上设置了一个 python 3 5 3 django 2 1 5 项目 一切都很好 Problem 只有 wkhtm
  • 如何在主队列上同步调度而不发生死锁?

    我需要在主队列上同步调度一个块 我不知道我当前是否在主线程上运行 天真的解决方案如下所示 dispatch sync dispatch get main queue block 但是 如果我当前位于主队列上运行的块内 则此调用会造成死锁 同