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在开发中的常见问题的更多相关文章

  1. 第123天:移动web开发中的常见问题

    一.函数库 underscoreJS _.template: <ol class="carousel-indicators"> <!--渲染的HTML字符串--& ...

  2. vue 开发中的常见问题

    (一)eslint静态检查 在大家用vue-cli创建工程的时候,会有一项,使用使用eslint,如果选择了y,那么工程就会安装并启用eslint. 这里列举一下常见的错误: 1.多余的分号 2.定义 ...

  3. 移动端H5开发中的常见问题处理

    1.问题之合成海报: 功能技术:http://html2canvas.hertzen.com 问题描述:合成模糊.合成区域内容错位,合成不完整,合成边缘白条等. 解决方案:如有页面布局正常合成错位的, ...

  4. android 开发中的常见问题

    Android studio 使用极光推送, 显示获取sdk版本失败 在 build.gradle(Module.app) 添加 android {    sourceSets.main {      ...

  5. 算法、数据结构、与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design)

    算法.数据结构.与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design) 作者: Compasslg 李涵威 1. 什么是单例设计(Singleton Design) 在学 ...

  6. iOS开发中常见问题集锦

    在iOS开发中,会出现各种各样的问题.今天,就把这些常见的问题以及各位大牛的解决方案汇总下,方便以后查阅: 常见错误: 1. linker command failed with exit code ...

  7. ios开发中button控件的属性及常见问题

    最为最基本的控件,我们必须对button的每个常用属性都熟练应用: 1,使用之前,必须对按钮进行定义,为乐规范,在@interface ViewController (){}中进行定义,先定义后使用. ...

  8. 多线程在iOS开发中的应用

    多线程基本概念 01 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 02 线程 2-1 基本概念 1个进程要想执行任务,必须得有线程 ...

  9. 多线程技术在iOS开发中的使用

    进程和线程 要使用多线程,首先需要理解进程和线程这2个概念.这里我简单的说一下. 所谓进程对应的是一个应用程序,负责开辟内存空间供应用程序使用,但是进程不能执行任务(指令).一个进程至少包含一条线程, ...

  10. 深入理解 iOS 开发中的锁

    来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大 ...

随机推荐

  1. postgresql序列基本操作

    1.创建序列 CREATE SEQUENCE if not exists test_mergetable_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 99999999 ...

  2. Golang如何快速构建一个CLI小工示例

    这篇文章主要为大家介绍了Golang如何快速构建一个CLI小工具详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 如何Golang快速构建一个CLI小工具 在现实开发的 ...

  3. vivado报错vivado 12-8300 launch hls failed please see vivado hls.log for details

    报错: 解决方案: 1. Download the "y2k22_patch-1.2.zip" file attached to this page 2. Unzip the fi ...

  4. 使用 FPM 将源码包转化为rpm包(技巧)

                    使用 FPM  将源码包转化为rpm包 1.支持的源类型包 dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包 rpm: 对rpm进行转换 gem: 对r ...

  5. Qt中的多窗体编程(续一)

    在前面一节中,已经把所有需要的窗体都创建好了,下面将依次实现预设的功能. 一.实现点击菜单打开模式子窗体的功能. 1.在编辑模式下双击Forms下的"mainWindow.ui", ...

  6. 【C学习笔记】day4-1 在屏幕上输出以下图案

    1.在屏幕上输出以下图案: * *** ***** ******* ********* *********** ************* *********** ********* ******* ...

  7. php中的错误异常处理

    作者:小涵 |  阅读: 1636 在PHP5中添加了类似于其它语言的错误异常处理模块.在PHP代码中所产生的异常可被throw语句抛出并被catch语句捕获.需要进行异常处理的代码都必须放入 在PH ...

  8. Software_C#_grammer_Deletegate--Strategy

    2018-04-30 18:59:04. 由 委托的 动态选择方法 联想到的 Strategy Pattern 一 : 策略模式 将  宿主   与  算法 分离, 算法被封装为对象, 客户端代码用 ...

  9. Excel VBA实例

    有个朋友让帮忙看下excel数据怎么处理,初步一看有点复杂,难以下手.进一步分析.搜索,发现VBA可以很好地解决这个问题,总结记录一下. 问题描述:如下图,有N个sheet,每个sheet记录了一个公 ...

  10. ES使用

    shards 分片数 ES存储数据可以存储在多个分片 下载ES curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elas ...