美文网首页
关于在 MainQueue 中调用 sync 会造成死锁

关于在 MainQueue 中调用 sync 会造成死锁

作者: ZyonPaul | 来源:发表于2018-04-12 09:56 被阅读7次

首先需要明白 Queue 与 Thread 之间的关系。
SerialQueue 是串行队列, 有一个线程与之对应。
ConcurrencyQueue 为并发队列, 并发队列会根据 queue 中的 Task 数量与执行情况开启一个或多个线程。

synchronize 同步方法会阻塞当前线程,并在 sync 所需要执行的 Task 执行完之后重新激活当前线程。

因此, 当在 SerialQueue 的线程里向该 SerialQueue 中 sync 一个 Task 时,会挂起该 SerialQueue 所在的线程,等待该 Task 执行完毕。但该 Task 需要在该线程中执行,由于该线程已被挂起,所以 Task 永远不会被执行完毕。造成死锁。
(同理可理解至 MainQueue 中的情况)

在 ConcurrencyQueue 中 sync 一个 Task 时,会挂起执行中的线程, 另开辟一个线程去执行该 Task ,故不会造成死锁。

相关文章

  • 关于在 MainQueue 中调用 sync 会造成死锁

    首先需要明白 Queue 与 Thread 之间的关系。SerialQueue 是串行队列, 有一个线程与之对应。...

  • 同步串行导致的死锁问题

    GCD中同步操作dispatch_sync()中队列使用主队列会导致线程死锁,是众所周知的事情。但是是如何造成死锁...

  • 白话文之多线程

    Q: 什么情况下会产生死锁?A: 使用sync函数往当前的串行队列添加任务,会造成当前串行队列的死锁(互相等待) ...

  • sync造成死锁问题

    quene.sync将block添加到main queue中,这时主线程执行sync的事件暂停,等待block执行...

  • dispatch_barrier_sync死锁问题

    今天在项目中遇到了dispatch_barrier_sync死锁问题。dispatch_barrier_sync中...

  • GCD 中如何避免死锁和数据竞争

    一、死锁条件:1、同步操作中使用同步调用dispatch_sync;2、使用了串行队列3、调用了方法自己4、方法中...

  • OC底层原理探索—GCD(中)

    GCD死锁 进入dispatch_sync->_dispatch_sync_f->_dispatch_sync_f...

  • 一次面试的记录

    面试记录 提到以下问题: 线程死锁是什么?什么样的情况会造成死锁?如何确保不会发生死锁?在串行队列中,执行 A 时...

  • [Java]一个DeadLock(死锁)的例子

    今天在InteliJ里跑了一下,模拟了一个死锁。synchronized关键字修饰的方法可能会导致死锁。(Sync...

  • GCD解析

    死锁(Deadlock) 在串行队列中,当前队列的调度块内(包含嵌套)调用当前队列的同步任务会死锁异步调度块要等自...

网友评论

      本文标题:关于在 MainQueue 中调用 sync 会造成死锁

      本文链接:https://www.haomeiwen.com/subject/pcxxkftx.html