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. LKWA靶机学习

    LKWA靶机学习 目录 LKWA靶机学习 1 下载地址 2 Blind RCE 2.1 利用Burpsuite Collaborato模块来查看输出. 2.2 尝试利用dnslog进行回显 3 XSS ...

  2. 钓鱼攻击之:WEB 钓鱼

    郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共同维护网络文明和谐. 钓鱼 ...

  3. [转载]python跨文件使用全局变量的实现

    python跨文件使用全局变量的实现 更新时间:2022-10-25 14:46:38发布时间:602天前 朗读 Python 定义了全局变量的特性,使用global 关键字修饰 1 global k ...

  4. 【狂神说】SpringMVC笔记

    1.回顾MVC ssm:mybatis+Spring+SpringMVC MVC三层架构 ssm框架:研究官方文档,锻炼自学能力,锻炼项目能力 SpringMVC+Vue+SpringBoot+Spr ...

  5. sqlserver 通过.mdf 和.ldf 恢复数据库

    USE master;GOCREATE DATABASE ImageManager ON (FILENAME = 'D:\LD\计时器demo\winform图片上传DB\ImageManager.m ...

  6. maven打包找不到本地jar包的解决方法

    有时候我们在项目中会引入一些本地jar包,在maven打包时会找不到这些jar,我们需要在pom.xml中的 <pluginManagement> <plugins> < ...

  7. Mysql数据库基础第五章:(一)事务

    Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...

  8. http协议与tcp协议的理解

    1.区别 tcp协议是对应于传输层,http协议是对应于应用层,从本质上来说,二者是没有可比性的.http协议是建立在tcp协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发送一次http请 ...

  9. el-dialog 遮罩层覆盖内容的问题

    页面组件层级太多,就会出现遮罩层覆盖dialog里面内容的问题 解决:  :append-to-body="true" 把遮罩层添加到body上面    用z-index 设置没效 ...

  10. having对聚合函数的结果集进行过滤

    SELECT rl.road_code,string_agg(distinct rs.tech_level_label, ',') from road_lst rlleft join road_sec ...