多线程-GCD

iOS多线程之GCD 一、基本概念 GCD 全称 Grand Central Dispatch,又称大中央调度,对线程操作进行了封装并提供简洁的C语言接口 1. 串行队列与并发队列 串行队列:任务按 FIFO 的顺序执行,同一时间只执行一个任务,按FIFO的顺序执行完毕 并发队列:任务按 FIFO 的顺序开始执行,同一时间可执行多个任务,任务完成的顺序不可预测 2. 同步派发和异步派发 GCD将 block 任务块派发到指定队列中执行,有同步、异步两种方式 1. 同步派发 dispatch_sync 会阻塞当前线程 阅读详情

01基本概念

iOS的多线程方案有哪几种?你更倾向于哪一种?

方案

他们底层其实都是依赖于pthread,更倾向于GCD

GCD常用函数

  • GCD中有2个用来执行任务的函数
    • 用同步的方式执行任务
      dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
      queue:队列
      block:任务
  • 用异步的方式执行任务
    dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
    GCD源码:https://github.com/apple/swift-corelibs-libdispatch
  • GCD的队列可以分为2大类型
    • 并发队列(Concurrent Dispatch Queue)
      可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)
      并发功能只有在异步(dispatch_async)函数下才有效

    • 串行队列(Serial Dispatch Queue)
      让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务),就算是异步函数也是一个接着一个

gcd带有create的也不要我们自己释放

GCD01

  • 有4个术语比较容易混淆:同步、异步、并发、串行
    同步和异步主要影响:能不能开启新的线程
    同步:在当前线程中执行任务,不具备开启新线程的能力
    异步:在新的线程中执行任务,具备开启新线程的能力

    并发和串行主要影响:任务的执行方式
    并发:多个任务并发(同时)执行
    串行:一个任务执行完毕后,再执行下一个任务

各种队列的执行效果

GCD02

死锁问题

以下代码会不会产生死锁
NSLog(@"任务1");
dispatch_queue_t mainQ = dispatch_get_main_queue();
dispatch_sync(mainQ, ^{
NSLog(@"任务2");
});
NSLog(@"任务3");
会产生死锁,
因为队列的特点就是排队FIFO,你把任务放到住队列里面,他会等前面的任务执行完,但是主队列中有一个任务了ViewDidLoad,又因为你是sync,希望立马在当前线程执行,执行完毕再往下执行。这样就造成了任务2和任务3之间相互等待。形成死锁

GCD-03

如果将sync改成async回会不会产生死锁
以下代码会不会产生死锁
NSLog(@"任务1");
dispatch_queue_t mainQ = dispatch_get_main_queue();
dispatch_async(mainQ, ^{
NSLog(@"任务2");
});
NSLog(@"任务3");
不会产生死锁。
如果用dispatch_sync会立马在当前线程执行任务,
如果用dispatch_async,不会要求在当前线程立马执行,是异步执行,等上一个任务执行完毕之后再执行。如果传的是并发队列,他会开启新的线程,

下面代码会不会产生死锁
//串行队列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
NSLog(@"任务1");
dispatch_async(queue, ^{ //0
NSLog(@"任务2");
dispatch_sync(queue, ^{//1
NSLog(@"任务3");
});
NSLog(@"任务4");
});
NSLog(@"任务5");
会产生死锁,因为block0的任务已经被添加到串行队列里面,block又是一个sync添加的任务,他是要求立即在当前线程执行任务,这样就造成了,block0等待队列重的block1任务执行,block1又要等待当前串行队列中之前正在执行的block0任务执行完毕之后才能呢执行,造成死锁

解决方法 开启另一个队列,这样就不用等待队列前面的任务执行完毕,就可以立即执行当前的任务,
//串行队列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue3 = dispatch_queue_create("myQueue3", DISPATCH_QUEUE_SERIAL);
//并发队列
dispatch_queue_t queue2 = dispatch_queue_create("myQueue2", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"任务1");

dispatch_async(queue, ^{ //0
    NSLog(@"任务2");
    NSLog(@"%@", [NSThread currentThread]);
    dispatch_sync(queue2, ^{//1
        NSLog(@"任务3");
        NSLog(@"%@", [NSThread currentThread]);
    });
    NSLog(@"任务4");
});
NSLog(@"任务5");

如果使用一个队列的话,可以使用一个并发队列,他也不会产生死锁,因为执行当前任务不用等前面的任务执行完毕,他们之间是并发执行的,可以同时执行多个任务

cgd04

  • 使用sync往当前串行队列添加任务,就会产生死锁,

不同方式获取的并发队列

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"%@", queue);//<OS_dispatch_queue: myQueue[0x17416f780]>
    dispatch_queue_t queue1 = dispatch_queue_create("myQueue1", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"%@", queue1);//<OS_dispatch_queue: myQueue1[0x17416f900]>
    dispatch_queue_t queue2 = dispatch_get_global_queue(0, 0);
    dispatch_queue_t queue3 = dispatch_get_global_queue(0, 0);
    NSLog(@"%@", queue2);//<OS_dispatch_queue_root: com.apple.root.default-qos[0x100189500]>
    NSLog(@"%@", queue3);//<OS_dispatch_queue_root: com.apple.root.default-qos[0x100189500]>

06面试题01

以下代码的打印结果是什么
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
NSLog(@"1");
[self performSelector:@selector(test) withObject:nil afterDelay:0];
NSLog(@"3" );
});
打印结果是:1、3
原因
performSelector:withObject:afterDelay:他的底层用到了NSTimer定时器,他的本质是往Runloop中添加定时器。子线程默认没有启动Runloop,所以不能执行
在主线程中是可以使用的,主线程中的runloop是默认开启的。

07-GNUstep

performSelector:withObject:afterDelay:这个方法的源码我们看不到,不开源。
GNUstep是GNU计划的项目之一,它将Cocoa的OC库重新开源实现了一遍
源码地址:http://www.gnustep.org/resources/downloads.php
虽然GNUstep不是苹果官方源码,但还是具有一定的参考价值
通过源码分析我们看到performSelector:withObject:afterDelay:这个方法底层就是往里面runloop里面添加了一个timer,所有我们只需要手动开起就可以了

08-面试题02

NSThread *thread = [[NSThread alloc] initWithBlock:^{
NSLog(@"1");
}];
[thread start];
[self performSelector:@selector(test) onThread:thread withObject:nil waitUntilDone:YES];

  • (void)test
    {
    NSLog(@"2");
    }
    结果,打印1 然后崩溃,因为子线程中的任务执行完就直接退出, 我们再给让他执行任务的时候他已经销毁了

09GCD队列组.

思考:如何用gcd实现以下功能
异步并发执行任务1、任务2
等任务1、任务2都执行完毕后,再回到主线程执行任务3

【iOS】多线程问题总结--GCD 在 iOS 开发过程中,我们一般在主线程里边进行 UI 刷新,例如:点击、滚动、拖拽等事件。我们通常把一些耗时的操作放在其他线程,比如说图片下载、文件上传等耗时操作。而当我们有时候在其他线程完成了耗时操作时,需要回到主线程,那么就用到了线程之间的通讯。 阅读详情

相关推荐

Windows server 2012R2安装Oracle11g

打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Database Configuration Assistant。打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Net Configuration Assistant。首先打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。选择仅安装数据库软件。

qq_74770105的博客 3595

多线程之GCD(上)

多线程之GCD(上)进程和线程GCD源码解析GCD 进程和线程 什么进程呢?进程是指在系统中正在运行的一个应用程序,也就是我们开发的每一个APP。每个进程之间是独立的,并且每个进程均运行在其专用的且受保护的内存空间内。通过“活动监视器”可以查看 Mac 系统中所开启的进程。 那什么事线程呢?线程是进程的基本执行单元,一个进程的所有任务都在线程中执行。进程要想执行任务,必须得有线程,进程至少要有一条线程。程序启动会默认开启一条线程,这条线程被称为主线程或 UI 线程。 进程和线程有什么关系呢? 一个线程可以

weixin_42983482的博客 551

微信小程序OCR身份证识别实战:从拍照到信息提取全流程解析

本文详细解析了微信小程序中OCR身份证识别的全流程实现,从环境配置、拍照上传到OCR核心识别及安全优化。通过微信开发者工具和OCR插件,开发者可快速构建高效的身份信息采集系统,提升用户体验和数据安全性。重点介绍了图像处理、加密传输及混合云架构等企业级解决方案。

j0k1l2m3n的博客 455

iOS - 多线程-GCD

GNUstep是GNU计划的项目之一,它将Cocoa的OC库重新开源实现了一遍。虽然GNUstep不是苹果官方源码,但还是具有一定的参考价值。队列(Concurrent Dispatch Queue)看似是在没有延迟的情况下执行,实际上因为该方法是基于。队列(Serial Dispatch Queue)添加一个定时器,但是因为此时我们是在。这时候都有打印,只不过打印顺序。主要影响:能不能开启新的线程。主要影响:任务的执行方式。上面的例子中,主要是考察。,这次打印顺序是正常的。

sharp521的博客 1230

ICC2 实战秘籍:create_workspace 命令全解析

必选项:工作区名称,这可是创建工作区的 “身份证”,必不可少。技术数据选项匹配:优先考虑用 -technology 直接加载技术文件,这是获取最新、最准确技术数据的首选路径;要是已经有合适的技术库了,那 -use_technology_lib 引用现有技术库也能快速上手。精度设置优先规则:技术文件自动配置排在第一位,能自动适配就别手动操心;要是自动配置不理想,那就显式指定 scale_factor;实在没要求,就用默认配置,但得清楚它的精度限制。

weixin_50820814的博客 1123

FPGA AXI DDR3读写时序调试与FIFO缓存实战解析

本文深入解析FPGA中AXI协议与DDR3的读写时序调试,重点探讨FIFO缓存在数据流控制中的关键作用。通过实战案例详细讲解突发传输中的地址对齐、数据分片等常见问题,并提供状态机设计、仿真波形分析和性能优化技巧,帮助开发者高效解决高速数据存储场景下的时序同步与数据一致性问题。

blockchain9miner的博客 1117

iOS 多线程之 GCD 的介绍

GCD 是异步执行任务的技术之一。一般将应用程序中记述的线程管理用代码在系统级中实现。开发者可以定义想执行的任务并追加到适当的 Dispatch Queue 中,GCD 就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可以统一管理,也可执行任务,这样,就比以前的线程更有效率。GCD是纯 C语言,并且它的大多数函数是以 dispatch 开始的。

满脸胡茬的小码农 599

基于RK3588边缘计算平台的人数统计系统设计与实现

针对人数统计场景优化的YOLOv5模型完整的模型转换和部署流程高效的嵌入式推理优化方案低成本、低功耗的部署方案实时性强,满足工业应用需求可扩展性好,适配多种应用场景引入注意力机制,提高小目标检测能力结合多模态信息,增强系统鲁棒性开发可视化管理平台,提升用户体验随着边缘计算和AIoT技术的快速发展,基于深度学习的智能视觉系统必将在更多领域发挥重要作用。本项目为相关应用的开发和部署提供了有价值的参考,为推动人工智能技术的产业化应用做出了积极贡献。

LXY_LOVE36的博客 142

iOS GCD多线程

本篇博客共分以下几个模块来介绍GCD的相关内容: 多线程相关概念多线程编程技术的优缺点比较?GCD中的三种队列类型The main queue(主线程串行队列)Global queue(全局并发队列)Custom queue (自定义队列)Group queue (队列组)GCD中一些系统提供的常用dispatch方法 欢迎访问作者个人博客www.dullgrass.com,更多好的文章与

-此夜微凉 661

AI大模型:(三)3.2 Spring AI实现Agent

SpringAI实现了流式对话功能,通过与Ollama模型集成完成前后端交互,当前版本存在thinking信息丢失问题。系统支持两种工具注册方式(方法注解和函数式),并内置时间工具类展示外部工具调用能力。记忆功能提供多种存储方案(内存、JDBC、NoSQL等),实现跨对话轮次的上下文保持。MCP协议集成方面,服务端实现计算和业务查询工具,客户端支持12306及自定义业务系统接入。完整演示了流式对话、工具调用与记忆功能的综合应用。该实践构建了具备复杂交互能力的AI系统,同时指出生产环境需关注的安全与优化问题。

haylee的专栏 1007

YOLO26改进策略【YOLO和Mamba】| MLLA:Mamba-Like Linear Attention,融合Mamba设计优势的注意力机制

本文记录的是利用模块优化的目标检测网络模型。模块具有独特优势。它不同于传统模块,能同时兼顾局部特征高效建模与长距离交互学习。常见模块要么在局部特征处理上有优势但长距离交互能力弱,要么反之,而模块克服了此问题。它融合了Mamba模型和线性注意力机制的优势,通过独特的结构设计,能够在保持计算效率的同时,精准地建模局部特征并学习长距离交互信息。本文将其用于的模型改进和二次创新,能够更加关注图像中的重要特征区域,抑制背景等无关信息的干扰,从而突出目标物体的关键特征。Demystify Mamba in Vision

Limiiiing的博客 213

多线程GCD

多线程GCD标签(空格分隔): 网络多线程GCDGCD是苹果公司为多核的并行运算提出的解决方案,全称是Grand Central Dispatch,是牛逼的中枢调度器,GCD提供了非常多强大的函数,GCD会自动利用更多的CPU内核,会自动管理线程的生命周期。GCD的使用步骤 定制任务:要做得事情 将任务添加到队列中 GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO

maomaopanjiu的博客 928

Vue3 - 详解实现网站接入微信扫码登录功能,微信授权生成登录二维码用户用手机扫描二维码登陆,微信扫描二维码登录详细流程及示例代码,支持弹框式、浏览器单独新开页显示,最新vue集成微信扫码授权登录!

vue3,nuxt3,PC网站,网页,微信扫码登录,微信登陆,vue3微信扫码登录,获取个人信息,扫码登录后如何获取用户手机号,微信扫码授权登录,vue3详细实现微信扫一扫登陆,pc网页微信登录,vue3集成微信扫码登录,详细流程和示例源码,第三方扫码登录,vue3微信扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,微信扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描微信二维码登录网站,最好用的插件,vue-wxlo

🏆 前端领域优质创作者 1万+

iOS面试:4.多线程GCD

进程是指在系统中正在运行的一个应用程序。对于电脑而已,你打开一个软件,就相当于开启了一个进程。对于手机而已,你打开了一个APP,就相当于开启了一个进程。线程是进程的基本执行单位。一个进程中至少会有一条线程,当然也可能会有多条线程。比如你使用QQ音乐听歌,系统会创建一条线程去播放音乐。使用QQ音乐下载歌曲,系统会创建一条线程去下载歌曲。这两个操作是可以同时进行的,也就说一个进程中可以同时运行多条线程。

长沙火山 3062

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

多线程 gcd

iOS中多线程编程工具主要有:  NSThreadNSOperationGCD 这三种方法都简单易用,各有千秋.但无疑GCD是最有诱惑力的,因为其本身是apple为多核的并行运算提出的解决方案.虽然当前移动平台用双核的不多,但不影响GCD作为多线程编程的利器(ipad2已经是双核了,这无疑是一个趋势). http://www.cnblogs.com/scorpiozj/archive/2

u013375242的专栏 672

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

iOS —— 多线程GCD

一、什么是 GCD 1. GCD 是苹果为解决多线程而定义的一套库,并且 GCD 可以自动管理线程的生命周期,就和 ARC 类似,不需要我们手动去管理 2. GCD 是用 纯C 语言 写的,所以我门使用的是 GCD 中的函数,并不是面向对象的方法 3. GCD 核心概念   1)任务 : 就是某个线程要执行的方法   2)队列 : 存放所有的任务 4. GCD 使用步骤...

along1313的博客 194

多线程之GCD探索

一、多线程理解 进程是操作系统的最小执行单元,线程是进程执行的最小单元,iOS是单进程,多线程执行的,进程之间资源不共享。 多线程可以提高程序的执行效率,其实是提高了资源的利用率,对于单核CPU来讲,通过在不同任务之间切换来达到任务同时执行的假象,对于多核CPU来讲 才是真正的并发。GCD 正是充分的利用了多核cpu 二、GCD grand central dispatch 自动管理线程的生命...

j_xbing的博客 224

iOS多线程——GCD与NSOperation总结

iOS多线程——GCD与NSOperation总结 很长时间以来,我个人(可能还有很多同学),对多线程编程都存在一些误解。一个很明显的表现是,很多人有这样的看法: 新开一个线程,能提高速度,避免阻塞主线程 毕竟多线程嘛,几个线程一起跑任务,速度快,还不阻塞主线程,简直完美。   在某些场合,我们还见过另一个“高深”的名词——“异步”。这东西好像和多线...

Draven__的博客 454

iOS 多线程编程 GCD 死锁

GCD:Grand Central DiapathGCD多线程中的几组概念: 任务:即操作,你想要干什么,说白了就是一段代码,在GCD中的一个block就是一个任务。 任务的执行方式有两种: 同步执行和异步执行,两者的区分在于是否会阻塞当前线程直到block中的任务执行完毕。 同步执行(sync) :会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行。

学海无涯苦作舟 889

多线程的常用方法及GCD

一 :多线程的常用方法 //判断当前线程是否是多线程 //+ (BOOL)isMultiThreaded; //获取当前线程对象 //+ (BOOL)currentThread; //使当前线程睡眠指定的时间,单位为秒 //+ (void)sleepForTimeInterval:(NSTimeInterval)ti; //退出当前线程 //+ (void)exit; //判断当...

dayaomoshen的博客 363

iOS 多线程之GCD

级别: ★★☆☆☆ 标签:「iOS」「多线程」「GCD」 作者: dac_1033 审校: QiShare团队 一、GCD简介 Grand Central Dispatch(GCD)是由苹果开发的多线程调度框架,能够优化多线程应用程序的执行过程以支持多核处理器。GCD底层有线程池,线程池的概念在上一篇文章中有简单介绍,线程池是系统自动来维护,开发者只关注队列(Dispatch Queue)及任...

weixin_33912445的博客 153

iOS多线程之GCD详解

GCD(Grand Central Dispatch)是基于C语言开发的一套多线程开发机制。也是目前苹果官方推荐的多线程开发方法。iOS三种多线程开发中GCD是抽象层次最高的。当然用起来也是最简单的。只是它基于C语言开发。并不像NSOperation是面向对象的开发。而是完全面向过程的。这种机制相比较于前面两种多线程开发方式最明显的优点就是它对于多核运算更佳有效。 GCD中也有一个类似...

ddiv24492的博客 102

iOS多线程GCD

GCD是和block紧密相连的,所以最好先了解下block。GCD是C level的函数,这意味着它也提供了C的函数指针作为参数。 下面首先来看GCD的使用: dispatch_async(dispatch_queue_tqueue,dispatch_block_tblock); async表明异步运行,除了async,还有sync(同步),delay(延时) block代表的是你要...

weixin_30617561的博客 71

多线程编程 - GCD

一、简介 在iOS所有实现多线程的方案中,GCD应该是最有魅力的,因为 GCD本身是苹果公司为多核的并行运算提出的解决方案。GCD在工作时会自动利用更多的处理器核心,以充分利用更强大的机器。GCD是Grand Central Dispatch的简称,它是基于C语言的。如果使用GCD,完全由系统管理线程,我们不需要编写线程代码。只需定义想要执行的任务,然后添加到适当的调度队列(dispatch

欢迎关注我的微信公众号:Vichuzhu 1257
上一篇: RunLoop
下一篇: 内存管理-Tagged%20Pointer
I微微一笑I
博客等级 码龄11年 0粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值