iOS多线程-GCD的总结

本文深入讲解GCD(Grand Central Dispatch)技术,介绍如何使用GCD生成串行和并行DispatchQueue,实现异步和同步任务执行,以及信号量在保持线程同步中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GCD( Grand Central Dispatch )是异步执行任务的技术之一

开发者只需要定义想执行的任务并追加到适当的 Dispatch Queue 中,GCD 就能生成必要的线程并计划的执行任务

Dispatch Queue 是执行处理的等待队列(先进先出),共有两种等待队列:

Serial Dispatch Queue 等待处理结束队列(串行)

Concurrent Dispatch Queue 不等待处理结束队列(并行)

dispatch_queue_t  获取方法

1、dispatch_queue_create

//通过 GCD 的 API 生成 Dispatch Queue,
//第一个参数是指定 dispatch_queue 的名称
//第二个参数是指 dispatch_queue 的类型


//生成Serial Dispatch Queue
dispatch_queue_t queue = dispatch_queue_create("com.example",DISPATCH_QUEUE_SERIAL);

//生成Concurrent Dispatch Queue
dispatch_queue_t queue = dispatch_queue_create("com.example2",DISPATCH_QUEUE_CONCURRENT);

2、获取系统标准提供的 Dispatch Queue


//主线程 Serial Dispatch Queue
dispatch_get_main_queue();

//全局的Concurrent Dispatch Queue,第一参数是优先级
//第二个参数暂时没用
//(高优先级)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

//(默认优先级)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

//(低优先级)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0);

//(后台优先级)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);

dispatch_after 延时执行方法

//延时操作,在指定时间追加处理到Dispatch Queue
//第一个参数指定时间,第二个参数指定多少秒后的时间
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3*NSEC_PER_SEC);

dispatch_after(time,dispatch_get_main_queue(),^{
    NSLog(@"aaa");
});

dispatch_sync 同步操作

  • dispatch_sync() 是线程同步操作,其作用就是阻塞线程,先让它的block执行完毕,才会返回。
  • dipatch_sync() 造成死锁的条件是:如果在同一个串行队列(不管是不是主队列)添加同步任务,就会死锁,反之则不会

dispatch_apply 快速迭代方法

//作用:按照指定的次数将指定的任务追加到指定的队列中,并等待全部队列执行结束
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

NSLog(@"apply---begin");

dispatch_apply(6, queue, ^(size_t index) {
	NSLog(@"%zd---%@",index, [NSThread currentThread]);
});

NSLog(@"apply---end");

dispatch_semaphore 信号量

//是持有计数的信号,计数小于0时等待,不可通过。计数为0或者大于0时,计数减1且不等待,可通过。
//保持线程同步,将异步执行任务转为同步执行任务
//保证线程安全,为线程加锁




//创建一个Semaphore并初始化信号的总量
//这里的传入的参数value必须大于或等于0,否则dispatch_semaphore_create会返回NULL。
dispatch_semaphore_semaphore_create:

//发送一个信号,让信号总量加1
//当返回值不为0时,表示其当前有(一个或多个)线程等待其处理的信号量
//并且该函数唤醒了一个等待的线程(当线程有优先级时,唤醒优先级最高的线程;否则随机唤醒)。
dispatch_semaphore_signal:

//可以使总信号量减1,信号总量小于0时就会一直等待(阻塞所在线程),否则就可以正常执行
//这个函数的作用是这样的,如果信号量的值大于0,该函数所处线程就继续执行下面的语句,并且将信号量的值减1;
//如果信号量的值为0,那么这个函数就阻塞当前线程等待timeout(注意timeout的类型为dispatch_time_t,不能直接传入整形或float型数)
//如果等待的期间信号量的值被dispatch_semaphore_signal函数加1了,
//且该函数(即dispatch_semaphore_wait)所处线程获得了信号量,那么就继续向下执行并将信号量减1。
//如果等待期间没有获取到信号量或者信号量的值一直为0,那么等到timeout时,其所处线程自动执行其后语句。
dispatch_semaphore_wait:

 

 

 

 

通过 GCD 的 API 生成 Dispatch Queue

[Tōngguò GCD de API shēngchéng Dispatch Queue]

Generate Dispatch Queue from GCD's API

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值