iOS dispatch几种死锁的验证

示例一:

iOS dispatch几种死锁的验证_第1张图片

会发生死锁,简单判断就是外部线程是主线程,dispatch_sync到的是主队列,主队列是个串行队列。

示例二:

iOS dispatch几种死锁的验证_第2张图片

不会发生死锁。思路:外面是主线程,内部是个全局并行队列,同步到的这个队列不和外面的线程一个队列,并且不是串行队列。因为是dispatch_sync是同步操作,把需要在主线程运行的block加入到0并发队列里。所以运行结果是:123.

iOS dispatch几种死锁的验证_第3张图片

dispatch_sync中block执行和外部所在线程是一个线程。但是有一种情况不是---请看示例四。

示例三:

iOS dispatch几种死锁的验证_第4张图片

会发生死锁。思路:NSLog(@"3")被同步到了自定义串行队列所在的线程,就会发生死锁。会输入152,然后发生死锁。


iOS dispatch几种死锁的验证_第5张图片

可以看出dispatch_async会为串行队列创建线程。

示例四:
问题一:dispatch_sync同步执行的任务会在哪个线程?

iOS dispatch几种死锁的验证_第6张图片
iOS dispatch几种死锁的验证_第7张图片

可以看出,都是在线程8执行的。
下面改为在主线程执行:

iOS dispatch几种死锁的验证_第8张图片
iOS dispatch几种死锁的验证_第9张图片

上面两组执行的结果都是15234。
上述例子不会发生死锁。

示例五:

iOS dispatch几种死锁的验证_第10张图片

在子线程中dispatch_sync到主线程的block任务,只会跟到最后吗?(此处请各位指教
所以,按照只会添加到最后的机制,把while(1)打开,2永远不会被执行。

iOS dispatch几种死锁的验证_第11张图片

几种死锁程序来自下面链接:
https://github.com/ming1016/study/wiki/细说GCD(Grand-Central-Dispatch)如何用

你可能感兴趣的:(iOS dispatch几种死锁的验证)