常用的GCD接口

GCD详解 什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像 NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之 NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。 除了代码的平行执行能力, 阅读详情

多线程的优点:

1、能适当提高程序的执行效率。

2、能适当提高资源利用率(CPU、内存利用率)

多线程的缺点:

1、开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能

2、线程越多,CPU在调度线程上的开销就越大

3、程序设计更加复杂:比如线程之间的通信、多线程的数据共享

4、CPU在同一时间只能执行一个线程,之所以看起来多个线程能同时进行工作,这是因为CPU在多个线程之间来回切换的原因,如果cpu来回切换的速度够快,就造成了多线程并发执行的假象。


我们使用的Dispatch Queue有以下几种:

Global Queue-全局并发队列,由整个进程共享。队列中的任务按照FIFO顺序执行,同一时间可同时执行多个任务。

// 第1个参数表示队列执行的优先级:
// DISPATCH_QUEUE_PRIORITY_HIGH-高优先级
// DISPATCH_QUEUE_PRIORITY_DEFAULT-中优先级
// DISPATCH_QUEUE_PRIORITY_LOW-低优先级
// DISPATCH_QUEUE_PRIORITY_BACKGROUND-最低优先级
// 第2个参数暂不支持,传0即可;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
Main Queue-主线程队列,属于串行队列。队列中的任务按照FIFO顺序在主线程中执行,因为是串行队列,同一时间只能执行一个任务。
dispatch_queue_t queue = dispatch_get_main_queue();
用户队列-用户自定义创建,可并发可串行。同样的队列中的任务按照FIFO顺序执行。
// 第一个参数:
// 队列ID,需要传递一个字符串,命名分格采用类似com.example.myqueue的格式;
// 第二个参数:
// 在ios 4.3以前不支持,传NULL即可;
// 在ios 4.3以后,这个参数表示队列类型。DISPATCH_QUEUE_SERIAL-创建一个串行队列;DISPATCH_QUEUE_CONCURRENT-创建一个并发队列;
dispatch_queue_t queue = dispatch_queue_create("", NULL);

常用的GCD接口有哪些?

1、dispatch_async

作用:提交block至指定的队列中并异步执行,函数在第一时间返回。常见用法如下

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 耗时的操作
    dispatch_async(dispatch_get_main_queue(), ^{
        // 更新界面
    });
});
2、dispatch_group_async(1) / dispatch_group_wait (2)/ dispatch_group_notify(3)

作用:(1)提交block至指定队列中并和一个dispatch_group_t对象关联,函数异步执行将在第一时间返回;

       (2)同步等待至指定group中的block执行完毕或执行超时函数才返回;

       (3)设置观察某个指定的group,等group中的block全部执行完毕后,向指定的queue提交block并异步执行;

这3个方法常常是搭配使用的,例如dispatch_group_async/dispatch_group_wait搭配

// 创建队列和组
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
// 向队列中添加block并关联组
dispatch_group_async(group, queue, ^{
    // 耗时操作1
});
dispatch_group_async(group, queue, ^{
    // 耗时操作2
});
// ...
// 同步等待指定group执行完毕或超时
// 超时时间可以设为:DISPATCH_TIME_FOREVER-永远不超时;DISPATCH_TIME_NOW-很短时间内即超时;
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// 后续操作,如更新界面
// ...
dispatch_group_async/dispatch_group_notify搭配使用
// 创建队列和组
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
// 向队列中添加block并关联组
dispatch_group_async(group, queue, ^{
    // 耗时操作1
});
dispatch_group_async(group, queue, ^{
    // 耗时操作2
});
// ...
// group中的block全部完成后添加block至queue;group可以不在queue中;
// dispatch_group_notify是异步的;
dispatch_group_notify(group, queue, ^{
   // 耗时操作3
});
// 后续操作,如更新界面
// ...
3、dispatch_apply

作用:提交一个block至指定队列并循环调用多次,直到所有的调用都执行完毕函数才返回。使用方法例如:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 此方法会让主线程同步等待至所有循环调用block都执行完毕才返回
// 在这里,queue最好是传递一个并发队列才能发挥这个方法的最大优势
// index表示循环次数
dispatch_apply(5, queue, ^(size_t index) {
        
});
// 后续操作,如更新界面
// ...

4、dispatch_barrier_async

作用:提交block到指定队列并异步执行,函数将在第一时间返回;如果这个队列是通过dispatch_queue_create方法创建的并发队列,则这个block要等到它队列前面的所有block执行完毕才会执行,排在这个block后面的block也要等到该block执行完毕才能执行;如果这个队列不是上述队列,则dispatch_barrier_async效果等同于dispatch_async。使用形式形如

dispatch_queue_t queue = dispatch_queue_create("com.zwxx.tiancai", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
    // some code
});
dispatch_barrier_async(queue, ^{
    // some code
});
dispatch_async(queue, ^{
    // some code
});
5、dispatch_once

作用:在应用程序的整个生命周期内只执行一次指定的block。常用它实现单例模式

+ (MyObject *)sharedMyObject
{
    static MyObject *_singleton = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _singleton = [[MyObject alloc] init];
    });
    return _singleton;
}

模型剪枝实战 | Torch-Pruning 库在YOLOv8上的应用指南 本文详细介绍了如何使用Torch-Pruning库对YOLOv8模型进行结构化剪枝,以实现模型“瘦身”。通过DepGraph(依赖图)技术自动处理层间依赖,确保剪枝安全。文章提供了从环境搭建、核心原理理解到完整剪枝流程的实战指南,并强调了剪枝后的微调与性能评估,帮助开发者在保持精度的同时显著提升模型推理速度。 阅读详情

相关推荐

从IR Drop到EM分析:数字IC电源规划中那些没人明说的细节(以MTCMOS配置为例)

本文深入探讨数字IC后端设计中电源规划的关键细节,特别关注MTCMOS配置、电源网络电阻最小化和level shifter供电等实战技巧。通过分析IR Drop和EM问题,提供优化floorplan和powerplan的具体策略,帮助工程师避免常见陷阱,提升芯片设计的稳定性和可靠性。

q9w8e7r6t5的博客 511

c语言中编辑gcd,GCD算法详解(C语言)

GCD算法详解目录GCD算法详解1.原理证法一证法二2.普通方法3.递归算法4.最美妙算法1.原理GCD算法是用于求解最大公约数的方法,利用了欧几里得算法,即辗转相除法。最重要的等式莫过于(核心中的核心):gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)证法一a可以表示成a = kb + r(a,b,k,r皆为正整数,且r假设d是a,b的...

weixin_30753697的博客 3481

AI驱动的CNC闭环加工系统:边缘实时控制与IIoT反馈实践

闭环控制是工业自动化的核心概念,指通过实时反馈调节系统输出以逼近目标值;其技术原理在于构建短于被控对象时间常数的确定性反馈链路,从而保障动态响应精度与稳定性。在智能制造落地中,AI正从离线分析工具演进为嵌入式实时决策单元,其核心价值在于将工艺知识模型化、控制指令轻量化、执行路径边缘化。典型应用场景包括CNC加工过程中的振动自适应调参、刀具磨损在线补偿及多机协同优化。本实践聚焦FANUC 0i-MF平台,基于Modbus TCP硬实时通信与轻量LSTM+CNN融合模型,实现217毫秒级AI推理与PMC寄存器直

weixin_29704001的博客 323

多线程NSThread、NSOperation、GCD

Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实 现机制是基于Mach的线程 开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的 开发中实现多线程的方案 •OC的NSThread •C语言的GCD接口(性能最好,代码更精简) •OC的NSOperation和NSOperationQueue(基于GCD) GCD 内部实现1> iOS和

u013134119的专栏 468

树莓派与ROS2

树莓派与ROS2(Robot Operating System 2)的结合使用为机器人开发、自动化控制以及物联网项目提供了强大的平台。

weixin_47695827的博客 1754

机器视觉最全面试题总结

空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样a. 是普通的卷积过程(dilation rate = 1),卷积后的感受野为3b. 是dilation rate = 2的空洞卷积,卷积后的感受野为5。

@bangbang的博客 9206

extendgcd函数c语言,GCD详解及实现二 常用API

dispatch_set_target_queue因为用dispatch_queue_create函数生成的Dispatch Queue不管是Serial Dispatch Queue还是Concurrent Dispatch Queue其优先级都使用与默认优先级Global Dispatch Queue相同执行优先级的线程。变更的Dispatch Queue的执行优先级,则可以使用dispatc...

weixin_42403124的博客 256

CS 188 Project3(RL) Q10:Approximate Q-Learning

实现一个近似的Q-learning学习代理,它学习状态特征的权重,其中许多状态可能共享相同的特征。在qlearningAgents.py中的ApproximateQAgent类中编写实现,它是PacmanQAgent的子类。 注:近似Q-learning学习假设在状态和动作对上存在一个特征函数f(s,a),它产生一个向量f1(s,a) .. fi(s,a) .. fn(s,a)特征值。我们在fe...

大模型与Agent智能体 2655

GCD详解及实现- 常用API

dispatch_set_target_queue因为用dispatch_queue_create函数生成的Dispatch Queue不管是Serial Dispatch Queue还是Concurrent Dispatch Queue其优先级都使用与默认优先级Global Dispatch Queue相同执行优先级的线程。变更的Dispatch Queue的执行优先级,则可以使用dispatch

pop_xiaohao的专栏 858

Claude Code(1):手把手教你安装配置 Claude Code

Claude Code 是一款强大的 AI 编程助手工具,能够帮助开发者提升编码效率。本文将详细介绍如何在不同操作系统上安装和配置 Claude Code,让你快速上手这款工具。

blues_C的博客 752

【GameFramework框架内置模块】9、有限状态机(FSM)

这篇文章分享FSM有限状态机,了解过StarForce源码的同学相比都比较了解,GameFramework框架给我们抽象了一个Procedure流程的概念。这个Procedure流程可以方便的处理我们游戏从启动到游戏的各个流程阶段的处理逻辑,实现的核心就是FSM状态机,内部的Procedure流程就是不同的FsmState状态。接下来,就是FSM有限状态机的教程了。有限状态机(Finite-state machine,FSM)

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2533

iOS多线程编程Part 3/3 - GCD

http://www.hrchen.com/2013/07/multi-threading-programming-of-ios-part-3/   iOS多线程编程Part 3/3 - GCD 前两部分介绍了NSThread、NSRunLoop和NSOperation,本文聊聊2011年WWDC时推出的神器GCD。GCD: Grand Central Dispatch,是一组用于实现...

lcdxwhj2003的专栏 362

Windows 11 安装 Maven:下载、安装、配置国内镜像、验证

本文详细介绍了在 Windows 11 系统中安装与配置 Apache Maven 的完整流程,包括 JDK 环境准备、Maven 下载解压、本地仓库路径设置、阿里云国内镜像加速配置、环境变量设置及安装验证。同时提供了常用 Maven 命令速查表,帮助开发者快速上手依赖管理与项目构建,提升开发效率。

寒水馨 · 轻量级技术文档 · hanshuixin.org 1502

光速道路:iOS多线程之『GCD』详尽总结

Grand Central Dispatch(GCD)是苹果为iOS提供的一套强大的多线程编程接口,可以让我们以极高的效率处理并发任务。在编程的旅程中,GCD是我们的得力助手,它帮助我们有效地管理线程,使我们的应用运行得更加流畅。这是因为我们试图在主队列中同步执行一个任务,但主队列已经在执行一个任务(也就是我们的代码本身),因此我们的任务会被阻塞,导致死锁。:如果有一组相关的任务,我们可以使用调度组来管理它们,使我们的代码更加清晰。:主队列负责UI的更新,如果在主队列中执行耗时任务,会导致UI变得不流畅。

good7ob的博客 295

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

GCD中常用函数及释义

GCD 中的常用函数 一. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的异步执行技术之一,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的

醉秀林的专栏 930

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

GCD中常用的函数

我们在上一篇笔记中讲异步函数和同步函数,以及各种队列时,学习过不少GCD函数,今天再补充两个GCD中常用的函数:dispatch_after( )函数和dispatch_once( )函数。其中,dispatch_after( )函数常用于延时执行任务,而dispatch_once( )是一次性执行代码的函数,常用于单例设计模式中。 一、GCD中延时执行任务的函数     首先来看GCD中用于延时

Enrica_Shi的博客 1130

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

GCD常用函数

1. ios延迟执行的几种方法 [selfperformSelector:@selector(方法)withObject:nilafterDelay:2.0]; [NSTimerscheduledTimerWithTimeInterval:2.0target:selfselector:@selector(方法)userInfo:nilrepeats:NO

anspencer的博客 1192

GCD 中的队列

GCD 中的队列 GCD 所提供的 API 虽然简单,但是十分强大。其提供了两种类型的队列,一种串行队列,一种并行队列。 提交到串行队列中的 block 任务遵循先进先出的顺序,由系统维护的线程池中的线程执行。虽然任务的执行线程是不确定的, 但是同一个时刻,同一个队列中的任务只会有一个任务在执行。但是,不同串行队列中的任务是并行的。 提交到并行队列中的任务则不同,系统会根据需要创建线程,并行执行队...

集腋成裘 1533

GCD深入学习之GCD的初识

如果移动端访问不佳,可以访问我的个人博客 现在网上关于GCD的介绍已经很多了,在项目中也经常用到,但是没怎么深入研究过,打算写一系列关于GCD使用,参考其他大神写的博客和Apple的技术文档总结一下,一是自己深入学习一下,二是以后忘了可以回过头来温习一下~ 什么是GCD?GCD全名是Grand Central Dispatch(大中央调度器),是系统级的,存在于libdispatch.dylib

W_C__L的博客 7301

iOS——GCD再学习

在异步方法内又同步执行了一个方法,又因为同步执行中的方法执行完成前会阻塞当前线程,因此任务3执行完成前会一直阻塞线程,但是这个同步方法是处于串行队列的,因此要执行任务3要等待任务4执行完,但是任务4又要等任务3执行完才能执行,因此发生了死锁,跟那个主队列+同步执行差不多。syncConcurrent任务在其他线程中执行到追加 任务 1 到主队列中,因为主队列现在没有正在执行的任务,所以,会直接执行主队列的 任务1,等 任务1 执行完毕,再接着执行 任务 2、任务 3。(异步执行 具备开启新线程的能力。

m0_73348697的博客 2243

iOS——【GCD】

GCD指的是Grand Central Dispatch,它是苹果公司开发的一套多线程编程技术。GCD提供了一种简单而有效的方式来管理应用程序中的并发任务。它通过将任务提交到适当的队列(串行队列或并发队列)来管理并发执行的任务,从而帮助开发者更轻松地实现并发编程,提高应用程序的性能和响应速度。上面的就是在后合线程中执行长时间处理,处理结束时,主线程使用该处理结果的源代码。这样,dispatch_async (queue, ^{ 这仅有 一行的代码表示让处理在后台线程中执行。

m0_73348697的博客 1921

GCD实践——GCD延时执行

这里我将为大家用两种方式来实现延时操作,分别是NSThread和GCD方式。并比较他们的优劣。我把代码放到了Github上面     ,中的GCD02. 【使用NSThread实现延迟】 (1)拖入GCD源码。代码如下: #import "ViewController.h" #import "GCD.h" @interface ViewController () @end @im

乞力马扎罗的雪CYF的博客 3406

【iOS】GCD学习

本博客撰写一下小蓝书的GCDGrand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。//让处理在后台线程中执行/**长时间处理*例如AR用画像识别*例如数据库访问*//*

weixin_72437555的博客 1314

GCD定时器(GCD Timer)

时间来不及了,赶快上车… /// 创建一个Timer // /** // dispatch_source创建方法 // // @param type 创建的dispatch_source的类型 // @param handle // @param mask // @param queue 添加到的队列 // @return 返回一个新创...

MeteoriteMan的博客 2533

iOS—GCD详解

文章目录多线程编程进程线程线程与进程的关系多线程编程多线程编程的问题GCD什么是GCDGCD任务和队列GCD的使用步骤队列的创建队列的获取任务的创建方法任务与队列不同组合方式的区别同步执行 + 并发队列异步执行 + 并发队列同步执行 + 串行队列异步执行 + 串行队列同步执行 + 主队列在主线程中调用 同步执行+主队列在其他线程中调用 同步执行+主队列异步执行 + 主队列GCD其他方法GCD栅栏方法:dispatch_barrier_asyncGCD延时执行方法:dispatch_afterGCD 一次性代

qq_45836906的博客 6624

多线程的常用方法及GCD

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

dayaomoshen的博客 364
上一篇: weak、 _weak、 _block的格式
下一篇: iOS 端导入微信支付 就爆21个红色警告
LibraXin
博客等级 码龄12年 11粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值