GCD死锁 多线程

复制代码
   NSLog(@"1");
    dispatch_sync(dispatch_get_main_queue(), ^{ // sync同步 main串行
        // 同步,异步--线程 同步-主线程
        // main_queue global_queue 串行队列,并发队列
        // 先进先出 3先进的,2后进的,应该先走外面的,但是同步要求
        // 先进先出,任务3先,任务2最后加入队列的,先进先出,等任务3执行,但是任务2是同步任务,
        NSLog(@"2");
    });
    NSLog(@"3");
复制代码

GCD:把任务添加到队列queue, 指定执行任务的函数(写在block里面)

sync会阻塞(必须按顺序执行)线程 同步

async异步,开线程

Q:上面代码输出结果是什么?

A:1

解释:主线程有3个任务:1,同步任务(主队列),任务3. 显然先输出1,任务2被添加到了主队列,任务2是最后添加的,根据GCD先进先出原则,应该先执行任务3然后执行任务2,但是sync同步阻塞线程,同步要求必须执行完Block内部的任务才能执行之后的任务,即必须先执行任务2然后再执行任务3,这样就造成了死循环,即死锁 deadLock

 

参考:http://www.superqq.com/blog/2015/10/16/five-case-know-gcd/

2021,9,14更新图片:

主队列是串行队列,先进先出,要求先3再2

同步线程要求 先2再3;  冲突了

 

 


 

2018、6、26更新:

主线程 添加任务的顺序是1,3,同步任务2,

根据先进先出原则,同步任务2需要执行完任务3再执行       2等待3

但任务2是同步任务,所以任务3需要任务2执行完毕再执行  3等待2

所以2,3任务互相等待,死锁了

总结:同步,串行可能死锁

https://hit-alibaba.github.io/interview/iOS/Cocoa-Touch/Multithreading.html

从这个例子可以看出,GCD设置线程间的依赖关系就会嵌套,嵌套很可能会出现死锁,所以为了方便的控制依赖的话,最好使用NSOperation

 

1
2
3
4
5
6
7
8
9
NSLog(@"1"); // 任务1
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSLog(@"2"); // 任务2
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"3"); // 任务3<br>     sleep(2);
    });
    NSLog(@"4"); // 任务4
});
NSLog(@"5"); // 任务5

 1,5,2,3,4

5,2顺序不定

3阻塞4的执行,必须等3执行完才能执行4

 

posted on   土匪7  阅读(205)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示