iOS线程 - GCD在开发中的常见问题
GCD 在开发中的常见问题
1 - 主线程中调用方法
① 执行 testONE 后的输出结果:1 5 2 4 3
1 -(void)testONE{
2
3 // 并发队列
4 dispatch_queue_t queue = dispatch_queue_create("cooci",DISPATCH_QUEUE_CONCURRENT);
5 NSLog(@"1");
6
7 // 异步函数
8 dispatch_async(queue, ^{
9 NSLog(@"2");
10
11 // 异步函数
12 dispatch_async(queue, ^{
13 NSLog(@"3");
14 });
15
16 NSLog(@"4");
17 });
18
19 NSLog(@"5");
20
21 }
② 执行 testTWO 后理论上输出结果:1 5 2 3 4,实际是 crash
1 // crash
2 -(void)testTWO{
3
4 // 串行队列
5 dispatch_queue_t queue = dispatch_queue_create("cooci",DISPATCH_QUEUE_SERIAL);
6 NSLog(@"1");
7
8 // 异步函数
9 dispatch_async(queue, ^{
10 NSLog(@"2");
11
12 // 任务 3 会阻塞线程,任务 4 需要等待 任务 3 执行完毕后方可执行
13 // 但是由于是异步函数,任务 4 根本不需要等待 任务 3 的执行
14 // 那么就会造成死锁问题,程序崩溃
15 dispatch_sync(queue, ^{
16 NSLog(@"3");
17 });
18
19 NSLog(@"4");
20 });
21
22 NSLog(@"5");
23
24 }
③ 执行 testTHREE 后输出结果:任务 1、2、3 首先无序执行;其次执行 任务 0(必定排在第四位);任务 4、5、6 最后无序执行
1 -(void)testTHREE{
2
3 // 并发队列
4 dispatch_queue_t queue = dispatch_queue_create("cooci",DISPATCH_QUEUE_CONCURRENT);
5
6 // 异步
7 dispatch_async(queue, ^{
8 NSLog(@"1");
9 });
10 // 异步
11 dispatch_async(queue, ^{
12 NSLog(@"2");
13 });
14 // 同步
15 dispatch_sync(queue, ^{
16 NSLog(@"3");
17 });
18
19 // 主线程
20 // ------------------
21 NSLog(@"0");
22 // ------------------
23
24
25 // 异步
26 dispatch_async(queue, ^{
27 NSLog(@"4");
28 });
29 // 异步
30 dispatch_async(queue, ^{
31 NSLog(@"5");
32 });
33 // 同步
34 dispatch_sync(queue, ^{
35 NSLog(@"6");
36 });
37
38 }
④ 多线程是不安全的,使用不规范极易出现抢占公共资源的问题
1 // 线程锁即可解决该问题
2 -(void)testFour{
3
4 __block int a = 0;
5 while (a < 4) {
6
7 // 抢占资源问题:多线程是不安全的
8 // 因为异步执行,则极有可能有一瞬间(一瞬间在计算机内部可以干 N 多事!我们想象有一台计算机极其强悍)存在多个异步函数同时在处理 a++
9 dispatch_async(dispatch_get_global_queue(0, 0), ^{
10 a++;
11 });
12 }
13 // 输出结果必定 >= 4
14 NSLog(@"%d",a);
15 }
iOS线程 - GCD在开发中的常见问题的更多相关文章
- 第123天:移动web开发中的常见问题
一.函数库 underscoreJS _.template: <ol class="carousel-indicators"> <!--渲染的HTML字符串--& ...
- vue 开发中的常见问题
(一)eslint静态检查 在大家用vue-cli创建工程的时候,会有一项,使用使用eslint,如果选择了y,那么工程就会安装并启用eslint. 这里列举一下常见的错误: 1.多余的分号 2.定义 ...
- 移动端H5开发中的常见问题处理
1.问题之合成海报: 功能技术:http://html2canvas.hertzen.com 问题描述:合成模糊.合成区域内容错位,合成不完整,合成边缘白条等. 解决方案:如有页面布局正常合成错位的, ...
- android 开发中的常见问题
Android studio 使用极光推送, 显示获取sdk版本失败 在 build.gradle(Module.app) 添加 android { sourceSets.main { ...
- 算法、数据结构、与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design)
算法.数据结构.与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design) 作者: Compasslg 李涵威 1. 什么是单例设计(Singleton Design) 在学 ...
- iOS开发中常见问题集锦
在iOS开发中,会出现各种各样的问题.今天,就把这些常见的问题以及各位大牛的解决方案汇总下,方便以后查阅: 常见错误: 1. linker command failed with exit code ...
- ios开发中button控件的属性及常见问题
最为最基本的控件,我们必须对button的每个常用属性都熟练应用: 1,使用之前,必须对按钮进行定义,为乐规范,在@interface ViewController (){}中进行定义,先定义后使用. ...
- 多线程在iOS开发中的应用
多线程基本概念 01 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 02 线程 2-1 基本概念 1个进程要想执行任务,必须得有线程 ...
- 多线程技术在iOS开发中的使用
进程和线程 要使用多线程,首先需要理解进程和线程这2个概念.这里我简单的说一下. 所谓进程对应的是一个应用程序,负责开辟内存空间供应用程序使用,但是进程不能执行任务(指令).一个进程至少包含一条线程, ...
- 深入理解 iOS 开发中的锁
来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大 ...
随机推荐
- OpenLayers集成ECharts
1. 引言 OpenLayers是WebGIS中常用的开源JavaScript前端库,ECharts是常用的可视化开源JavaScript前端库 OpenLayers官网:OpenLayers - W ...
- 一次k8s docker下.net程序的异常行为dump诊断
背景 昨天,一位朋友找到我寻求帮助.他的项目需要调用一个第三方项目的webAPI.这个webAPI本身可从header, query string中取相关信息,但同事发现他在调用时,无法按期望的那样从 ...
- docker下netcore内存dump
一般开发阶段可以通过visualstudio来检查程序的内存 .cup等的优化问题.vs下调试=>性能探查器,这里面大有千秋. 但是好多内存问题是经过时间积累下来才暴露出来的,在生产环境中不做不 ...
- ubuntu 启动脚本变化
ubuntu-16.10 开始不再使用initd管理系统,改用systemd- 快速看了 systemd 的使用方法,发现改动有点大, 包括用 systemctl 命令来替换了 service 和 c ...
- MATH026th: 《矩斋筹算丛刻》
矩斋筹算丛刻 (清)劳乃宣辑 清光绪刻朱墨套印本 2函22册竹纸线装 提要:内含 <古筹算考释>.<古筹算考释续编>.<筹算浅释>.<筹算分法浅释>.& ...
- tdlib成功编译版本20230205(java)
tdjni是java本地调用接口dll文件夹下的三个动态链接是供tdjni调用的使用时这三个加到系统环境变量里 编译文件在本人的文件里,可以下载
- sql(上)例题
一.数据库概述 数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合. 数据库管理系统(DataBase Management S ...
- 不可忽略的.gitignore_global
会不会很奇怪,本地的代码运行没有问题,以为自己提交到远程仓库了 但是别人下载下来却没有,有没有可能是你根本没提交上去,对了,你真的有可能没提交上去 你本地这个文件是灰色的,确实没有提交上去,但是项目中 ...
- 小白学python必选一本书籍《Python学习手册》(第4版)
<Python学习手册>(第4版)pdf高清版免费下载地址: 提取码:ihpl 内容简介 · · · · · · Google和YouTube由于Python的高可适应性.易于维护以及适 ...
- 1.1 创建一个WCF应用程序服务
第一步:引入System.ServiceModel.dll 第二步 定义一个WCF接口: //定义接口 [ServiceContract] interface IGetInfo { [Operatio ...