首页 > 其他分享 >iOS线程 - GCD常见问题

iOS线程 - GCD常见问题

时间:2022-10-20 02:11:34浏览次数:52  
标签:异步 常见问题 NSLog iOS dispatch queue 线程 async 执行

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 }

 

标签:异步,常见问题,NSLog,iOS,dispatch,queue,线程,async,执行
From: https://www.cnblogs.com/self-epoch/p/16808367.html

相关文章

  • iOS基础 - SceneDelegate
    前言1-自从Xcode11发布以来,当你使用新XCode创建一个新的iOS项目时SceneDelegate会被默认创建2-在iOS13后SceneDelegate将负责AppDelegate的某些功能......
  • 多线程中Callable简单使用
    Callable接口具备的特征如下1.有简单的类型参数,与call()方法的返回类型相对应2.声明了call方法,执行器运行任务时,该方法会被执行器执行,它必须返回声明中指定类型的对象3.......
  • 多线程
    多线程基础线程简介任务进程(Process)一个进程可以有多个线程线程(Thread)多线程核心线程就是独立的执行路径在程序运行时,即使没有自己创建的线......
  • 全局线程栈与连接流
    全局线程栈与连接流与线程绑定的是栈,用来储存自动变量。栈的每一个元素被称为栈帧,线程调用方法时,会向方法栈压入一个新帧。栈由编译器进行管理,自动分配和释放,存放函数调......
  • 彻底搞懂Ajax,Promise,Axios
    一、ajaxAJAX:异步JavaScript和XML,用来发送异步请求。有了Ajax之后,在无需重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。 Ajax是基于现有的Int......
  • h5页面在ios上无法滑动与z-index无效的情况
    ps:俩问题产生的原因是引用了scroll.js文件问题一:无法滑动scroll.js文件禁用了滑动事件,在不需要scroll方法的时候,解除禁用即可。/***滑动限制***/stop(){......
  • video视频播放,安卓和IOS差异
    IOS默认播放大屏播放,安卓播放可以同时播放多个,因为IOS默认是大屏播放所以不存在同时播放多个视频的现象。需求1、安卓一次播放一个视频,播放一个其中一个停止播放。co......
  • 学习线程池原理从手写一个线程池开始
    概述线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和细节吗?如果直接去看jdk源码的话,可能有一定......
  • iOS input 以及textarea失去焦点 无法进行输入
    百度了大部分的方法都不行后续通过跟朋友一起试验/*在css中对应的input以及textarea下添加*/input,textarea{-webkit-user-select:auto!important;}iOSi......
  • 进程与线程的区别
    1)地址空间:线程共享本进程的地址空间,而进程之间是独立的地址空间。2)资源:线程共享本进程的资源如内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好......