首页 > 其他分享 >解析 Grand Central Dispatch(GCD)的详细使用方法

解析 Grand Central Dispatch(GCD)的详细使用方法

时间:2024-05-10 15:36:24浏览次数:22  
标签:concurrentQueue Central GCD 队列 调度 Dispatch 并发 任务 执行

Grand Central Dispatch(GCD)是苹果提供的一种用于管理多线程编程的技术,它提供了一种简单而强大的方式来实现并发任务的调度和执行。本文将详细介绍 GCD 的使用方法,并提供一些常用的示例。

1. Dispatch Queue(调度队列)

调度队列是 GCD 中用于管理任务执行的核心概念,它分为两种类型:串行队列(Serial Queue)和并发队列(Concurrent Queue)。

  • 串行队列: 串行队列中的任务按照 FIFO(先进先出)的顺序依次执行,每次只有一个任务在执行。
  • 并发队列: 并发队列中的任务可以同时执行,任务的执行顺序取决于系统资源和任务的优先级。

示例:创建和使用调度队列

// 创建串行队列
let serialQueue = DispatchQueue(label: "com.example.serialQueue")

// 创建并发队列
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

// 异步执行任务到串行队列
serialQueue.async {
    // 执行任务
}

// 异步执行任务到并发队列
concurrentQueue.async {
    // 执行任务
}

2. Dispatch Work Item(调度工作项)

调度工作项是 GCD 中代表一个待执行的任务,它可以通过调度队列来执行。

示例:创建和执行调度工作项

// 创建调度工作项
let workItem = DispatchWorkItem {
    // 执行任务
}

// 异步执行调度工作项到调度队列
concurrentQueue.async(execute: workItem)

3. Dispatch Group(调度组)

调度组是一种用于组合多个任务的执行结果的机制,可以等待组内的所有任务都完成后执行后续操作。

示例:使用调度组等待任务完成

// 创建调度组
let group = DispatchGroup()

// 异步执行任务到调度队列并加入调度组
concurrentQueue.async(group: group) {
    // 执行任务
}

// 等待调度组中的所有任务完成
group.wait()

// 所有任务完成后执行后续操作
print("All tasks have completed.")

4. Dispatch Barrier(调度栅栏)

调度栅栏是一种用于在并发队列中控制任务执行顺序的机制,它可以保证在栅栏前的任务都完成后再执行栅栏后的任务。

示例:使用调度栅栏控制任务执行顺序

// 使用并发队列创建调度栅栏
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

// 异步执行多个任务到并发队列
concurrentQueue.async {
    // 执行任务 1
}

concurrentQueue.async {
    // 执行任务 2
}

// 插入调度栅栏
concurrentQueue.async(flags: .barrier) {
    // 在栅栏前的任务都完成后执行
    // 执行任务 3
}

5. Dispatch Semaphore(调度信号量)

调度信号量是一种用于控制同时执行任务数量的机制,它可以限制在指定数量的任务完成之前阻塞当前线程。

示例:使用调度信号量限制同时执行任务数量

// 创建调度信号量
let semaphore = DispatchSemaphore(value: 2) // 同时允许两个任务执行

// 创建并发队列
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

// 异步执行多个任务到并发队列
for i in 0..<5 {
    concurrentQueue.async {
        // 等待调度信号量
        semaphore.wait()
        
        // 执行任务
        print("Task \(i) started")
        
        // 任务完成后释放调度信号量
        semaphore.signal()
    }
}

6. 结论

Grand Central Dispatch(GCD)是 iOS 开发中管理多线程编程的重要技术之一,它提供了一系列强大而灵活的 API 来实现并发任务的调度和执行。通过合理地使用调度队列、调度工作项、调度组、调度栅栏和调度信号量等功能,我们可以更加高效地编写多线程代码,提高应用的性能和响应性。

标签:concurrentQueue,Central,GCD,队列,调度,Dispatch,并发,任务,执行
From: https://www.cnblogs.com/PaulpauL/p/18184452

相关文章

  • [题解]P5656 【模板】二元一次不定方程 (exgcd)
    P5656【模板】二元一次不定方程(exgcd)若存在\(ax+by=c\),则可以根据特解\(x,y\)求出任意通解\(x',y'\):\(\begin{cases}x'=x+k*\frac{b}{\gcd(a,b)}\\y'=y-k*\frac{a}{\gcd(a,b)}\end{cases}(k\in\mathbb{Z})\)求特解的方法是「扩展欧几里得(exgcd)」,如果没接触过可以先阅读......
  • dbt 使用adapter.dispatch 进行macro 的覆盖处理
    adapter.dispatch是一个很方便的功能,可以实现方法的重载,对于不同环境可以使用不同的macro,以下是一个简单示例macro定义appdemo.sql注意在macros目录下,当然可以修改{%macrodemo(name,age)%}#注意此处我没有指定,namespace或者package,对于package开......
  • 【数论】最大公因数和最小公倍数(GCD和LCM)
    最大公因数(GCD)两个数的最大公因数很好做,使用内置的库函数即可,注意x和y的类型要相同。llgcd=__gcd(x,y);如果要求多个数的最大公因数,那么初始化为0(因为根据定义,0和任何数x的gcd都是x,所以0是gcd操作的幺元),然后分别进行gcd即可。llgcd=0;for(inti=1;i<=n;++i)......
  • G. GCD on a grid
    G.GCDonagridNotlongago,EgorlearnedabouttheEuclideanalgorithmforfindingthegreatestcommondivisoroftwonumbers.Thegreatestcommondivisoroftwonumbers$a$and$b$isthelargestnumberthatdividesboth$a$and$b$withoutleavinga......
  • 【C++】gcd函数的写法
    ......
  • G. GCD on a grid
    原题链接题解\(gcd\)一定能被\(a[1][1],a[n][m]\)整除2.\(gcd\)能被通过的路径上所有元素整除由此分析:遍历\([1,\sqrt{gcd(a[1][1],a[n][m])}]\)判断能否通过(被路径上所有元素整除)我还在思考是广搜还是深搜,由于起点终点已知,求是否存在该路径,所以深搜有一个逆天优化......
  • Double dispatch和Visitor
    DoubledispatchandvisitorDispatch运行时多态,通过基类指针查找具体派生类的方法。Singledispatch单派发示例:Base*p=newDerived();p->Func();Doubledispatch派发、分发、分派,可以类比:总机-分机两次dispatch经常发生在使用vector保存同一类层级的指针......
  • 欧几里得算法求解GCD
    GCD(最大公约数)欧几里得算法(辗转相除法)原理if(a%b==0)GCD=belseGCD=b%(a%b)基本情况:如果其中一个数为0,则另一个非零数一定就是两数的GC......
  • QT开发:报错:QAxBase: Error calling IDispatch member Open: Exception thrown by serv
    在Qt中打开excel出现下面的错误提示:QAxBase:ErrorcallingIDispatchmemberOpen:Exceptionthrownbyserver怎么解决?错误提示通常意味着在尝试使用Qt的ActiveX模块(QAxBase)打开Excel文件时发生了异常。这可能是由于多种原因引起的,包括文件损坏、权限问题、Excel安装问题或者Q......
  • opensips的dispatcher模块笔记
    操作系统:CentOS7.6_x64opensips版本:2.4.9dispatcher模块模块实现了基于目的地址的调度功能,可用作无状态负载均衡,但不能保证均匀分配。今天整理下CentOS7环境下opensips2.4.9的dispatcher模块使用示例,并提供运行效果视频。我将从以下几方面进行展开:模块数据库说明模块参......