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. Linux 用户组管理

    用户组 群组是大家都熟悉的东西,群组有群主,也就是创建者.群管理员有一定的管理权限,比如上传群文件.管理成员等权限:群成员也有一定的权限,比如下载群文件. 私有组 一般来说,每一个用户都有自己的一个初 ...

  2. 地理探测器简介(R语言)

    地理探测器 1. 地理探测器原理 空间分异性是地理现象的基本特点之一.地理探测器是探测和利用空间分异性的工具.地理探测器包括4个探测器. 分异及因子探测:探测Y的空间分异性:以及探测某因子X多大程度上 ...

  3. pat乙级 1019 数字黑洞

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...

  4. Android 缩小动画

    public class MainActivity extends AppCompatActivity { private ConstraintLayout content; @Override pr ...

  5. 常用的基本Dos命令

    Windows+R: 输入cmd,运行控制台 #盘符切换: 盘名+: #查看当前目录下的所有文件: dir #切换目录: cd+文件名 #返回上一级: cd.. #清理屏幕: cls #退出终端: e ...

  6. 00_java基础笔记

    _01_命令提示符 //cmd的操作(Ms-DOS) /* * 进文件夹:cd 文件夹名 * 进多级文件:cd 文件夹1\文件夹2 * 返回上一级:cd .. * 回根路径:cd \ * 查看当前内容 ...

  7. frp使用教程

    内网穿透工具---frp使用教程 https://blog.csdn.net/u011215939/article/details/103383373

  8. 关于el-popover的箭头颜色

    因为会从四个方向不定弹出 所以需要写入4个方向: 注意弹出框是动态插入body中的,需写入根部样式中 如果有多个地方用到且颜色都不一样,可以用类名区分,elm提供了 然后把前面的 .el-popper ...

  9. redis之单线程

    一.redis为何是单线程 官方给出的答案: 因为 Redis 是基于内存的操作,CPU 不会成为 Redis 的瓶颈,而最有可能是机器内存的大小或者网络带宽.既然单线程容易实现,而且 CPU 不会成 ...

  10. git prior sync failed; rebase still in progress

    方案一: 将这个git直接删掉,rm common/ -rf 然后再回到项目根目录repo sync 方案二: git rebase --abort