博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS多线程学习五:GCD线程间通信+主队列添加同步任务崩溃问题
阅读量:3732 次
发布时间:2019-05-22

本文共 1551 字,大约阅读时间需要 5 分钟。

文章目录

一.线程间通信

1.创建子进程

创建子线程,向全局并发队列中添加异步任务

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

block
}

2.回归到主线程

回归到主线程,在子线程的block中调用,

如果是同步任务dispatch_sync,先等block代码执行完成之后,再执行之后的代码

dispatch_sync(dispatch_get_main_queue(), ^{

block
}

如果是异步任务dispatch_async,先执行之后的代码,再执行block里的代码。

dispatch_async(dispatch_get_main_queue(), ^{

block
}

在这里插入图片描述

二.主队里+同步任务崩溃问题

参考:

问题举例

NSLog(@“任务1”);

dispatch_sync(dispatch_get_main_queue(),^{
NSLog(@“任务2”);
});
NSLog(@“任务3”);

运行结果:只打印出“任务1”

执行步骤是:
1.任务1,肯定会执行
2.然后遇到了dispatch_sync,这是一个同步线程,同步线程会阻塞当前线程,必须等同步线程中的任务(任务2)执行完毕之后才会执行下一个任务(任务3),这时候会进入等待状态(等待任务2执行完成并返回)
3.dispatch_get_main_queue()是一个主队列,有任务来(任务3),就要加进去,而任务2处于等待中,所以会先加入任务3,之后任务2就排到了任务3的后面
4.这样就造成了这么一种状态
dispatch_sync说:我是同步的,必须等我的任务完成(任务2)执行完再执行其他任务(任务3);
dispatch_get_main_queue() 说:我是一个主队列,有人来我就要让他排队,任务2 还没来,任务3来了就让他先排队,等任务2来了,让他排在任务3的后面执行。先进先出,任务3执行完后才执行任务3;

这样就导致了任务3在等待任务2执行,任务2 在等待任务3执行,结果谁也执行不了。造成死锁。

解决办法

将整体放到一个子线程中,这样任务一在子线程,任务二在主线程,任务三依然在子线程。这样主队列只有一个同步任务。不会造成相会等待。

dispatch_async(dispatch_get_global_queue(0, 0), ^{

NSLog(@“任务一!!!%@”,[NSThread currentThread]);
dispatch_queue_t t = dispatch_get_main_queue();
// 同步任务
dispatch_sync(t, ^{
NSLog(@“任务二!!!!%@”,[NSThread currentThread]);
});
NSLog(@“任务三!!!!”); // 这里是子线程
});

注意:如果这样,向全局队列里添加同步任务,没有产生子线程线程,全部的任务都是在主线程中执行的,代码仍然会崩溃。

dispatch_sync(dispatch_get_global_queue(0, 0), ^{

NSLog(@“任务一!!!%@”,[NSThread currentThread]);
dispatch_queue_t t = dispatch_get_main_queue();
// 同步任务
dispatch_sync(t, ^{
NSLog(@“任务二!!!!%@”,[NSThread currentThread]);
});
NSLog(@“任务三!!!!”); // 这里是子线程
});

转载地址:http://jpwin.baihongyu.com/

你可能感兴趣的文章
2.3进程同步
查看>>
2.3浮点数的表示与运算
查看>>
2.4死锁
查看>>
2.4算术逻辑单元(ALU)
查看>>
3.1.1内存管理概念
查看>>
矩阵论——向量空间
查看>>
吴恩达机器学习——数值评价指标
查看>>
矩阵论——正交矩阵&Gram-Schimidt正交化
查看>>
Python语法——实现nc文件可视化的基本模块
查看>>
Anaconda完全入门指南
查看>>
如何创建、添加虚拟环境
查看>>
Anaconda prompt和cmd的区别
查看>>
第一个nc文件的信息读取
查看>>
netCDF——nc文件读取
查看>>
使用BaseMap绘制地图它不香么
查看>>
MeteoInfo介绍
查看>>
Basemap系列教程:使用shapefiles绘制地图
查看>>
numpy生成掩码数组
查看>>
np.squeeze():把张量中维度为1的维度去掉
查看>>
StringBuffer,StringBuilder的区别
查看>>