当您在Swift中的同步队列中异步调度任务时会发生什么?

保罗·席尔瓦

我发现这会产生死锁,但我不知道为什么。基本上,我在一个类中有一个队列,并且每次应该更改类的状态时,我都会在队列中将该任务作为同步任务运行:

private var serialQueue = DispatchQueue(label: "my_mutex_queue")
func changeState() {
  serialQueue.sync {
    // perform change
  }
}

状态的某些更改需要调用委托。在这种情况下,无法同步调用该任务,因为它将导致死锁。但是,异步调度也会导致死锁(我们仍然在队列“ my_mutex_queue”中的同步任务“ changeState”中):

func notifyDelegate() {
        serialQueue.async { 
            // notify delegate
        }
}

如果我将委托通知作为异步任务运行在另一个队列中,那么一切都会按预期进行。在Apple文档中找不到关于为何在同一队列中调用异步任务会导致死锁的注释。

尤金·杜德尼克(Eugene Dudnyk)

您无法serialQueue.sync从所执行的程序段中调用serialQueue

TL; DR;

我认为这可能正在发生:

  1. 你可以通过安排块AserialQueue.asyncnotifyDelegate
  2. 在执行块A的上下文中,您的委托changeState错误地假设当前线程不是的线程,从而调用serialQueue
  3. changeState方法serialQueue的调用堆栈上,您同步调度另一个serialQueue.sync无法启动的块B ,因为您等待它在当前由A进行的先前异步调度的块A中启动serialQueue

避免这种情况的方法:

  1. 切勿在用于同步的专用串行队列中调用公共回调。

或者

  1. 不要使用专用队列进行同步,请使用os_unfair_lockNSLockNSRecursiveLock代替。它还可能会提高性能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当您在python中设置字典时会发生什么?

来自分类Dev

大中央调度:当队列超载时会发生什么?

来自分类Dev

在lldb中打印Swift对象(po)时会发生什么?

来自分类Dev

同步调用异步函数时被调用者的线程会发生什么

来自分类Dev

当线程进入Java中的同步块/方法时会发生什么情况

来自分类Dev

当我在异步回调中设置对象时会发生什么?

来自分类Dev

当您在JavaScript中分配undefined时会发生什么?

来自分类Dev

在同步方法内部的线程中的同步块会发生什么?

来自分类Dev

异步任务中止后会发生什么?

来自分类Dev

在Swift中包装和展开可选对象时会发生什么?

来自分类Dev

在 Swift 中,当两个线程获取并设置非线程安全属性时会发生什么?

来自分类Dev

python中是否有非同步队列

来自分类Dev

ThreadPoolTaskExecutor bean中的同步队列公平性策略?

来自分类Dev

在Redux中链接多个异步调度

来自分类Dev

React在异步调用中调度方法

来自分类Dev

当您从《虚无》中抽奖时会发生什么?

来自分类Dev

VHDL中的整数超出范围时会发生什么?

来自分类Dev

当函数在python中返回自己的名称时会发生什么?

来自分类Dev

当软件包在源中重复时会发生什么?

来自分类Dev

当Final块中的代码引发异常时会发生什么?

来自分类Dev

在C ++标准中,当违反“应”要求时会发生什么?

来自分类Dev

在SVN中删除中继时会发生什么标记

来自分类Dev

在python中的str上使用encoding时会发生什么?

来自分类Dev

在Git中删除分支时会发生什么情况

来自分类Dev

在RTOS中释放或发出信号时会发生什么?

来自分类Dev

在SwiftUI中,显示操作表时会发生什么?

来自分类Dev

为什么在文件中写入csv时会发生错误?

来自分类Dev

当flet在递归函数中时会发生什么?

来自分类Dev

当声明符(我/州)在for块中时会发生什么?

Related 相关文章

  1. 1

    当您在python中设置字典时会发生什么?

  2. 2

    大中央调度:当队列超载时会发生什么?

  3. 3

    在lldb中打印Swift对象(po)时会发生什么?

  4. 4

    同步调用异步函数时被调用者的线程会发生什么

  5. 5

    当线程进入Java中的同步块/方法时会发生什么情况

  6. 6

    当我在异步回调中设置对象时会发生什么?

  7. 7

    当您在JavaScript中分配undefined时会发生什么?

  8. 8

    在同步方法内部的线程中的同步块会发生什么?

  9. 9

    异步任务中止后会发生什么?

  10. 10

    在Swift中包装和展开可选对象时会发生什么?

  11. 11

    在 Swift 中,当两个线程获取并设置非线程安全属性时会发生什么?

  12. 12

    python中是否有非同步队列

  13. 13

    ThreadPoolTaskExecutor bean中的同步队列公平性策略?

  14. 14

    在Redux中链接多个异步调度

  15. 15

    React在异步调用中调度方法

  16. 16

    当您从《虚无》中抽奖时会发生什么?

  17. 17

    VHDL中的整数超出范围时会发生什么?

  18. 18

    当函数在python中返回自己的名称时会发生什么?

  19. 19

    当软件包在源中重复时会发生什么?

  20. 20

    当Final块中的代码引发异常时会发生什么?

  21. 21

    在C ++标准中,当违反“应”要求时会发生什么?

  22. 22

    在SVN中删除中继时会发生什么标记

  23. 23

    在python中的str上使用encoding时会发生什么?

  24. 24

    在Git中删除分支时会发生什么情况

  25. 25

    在RTOS中释放或发出信号时会发生什么?

  26. 26

    在SwiftUI中,显示操作表时会发生什么?

  27. 27

    为什么在文件中写入csv时会发生错误?

  28. 28

    当flet在递归函数中时会发生什么?

  29. 29

    当声明符(我/州)在for块中时会发生什么?

热门标签

归档