GCD单例 栅栏函数 调度组 信号量dispatch_semaphore dispatch_source

本文介绍了GCD中的单例实现原理,以及栅栏函数、调度组、dispatch_semaphore信号量的作用,强调了它们在控制并发任务执行顺序和数量中的关键作用。同时提到了dispatch_source用于监听事件的特性及其用法。
摘要由CSDN通过智能技术生成

GCD单例的原理

基本思想就是通过状态的判断使得block只被调⽤⼀次。

核⼼代码:

栅栏函数

栅栏函数的效果:等待栅栏函数前添加到队列⾥⾯的任务全部执⾏完成之后,才会执⾏栅栏函数⾥

⾯的任务,栅栏函数⾥⾯的任务执⾏完成之后才会执⾏栅栏函数后⾯的队列⾥⾯的任务。

需要注意的点:

1. 栅栏函数只对同⼀队列起作⽤。

2. 栅栏函数对全局并发队列⽆效。

调度组

调度组的效果:等待调度组前⾯的任务执⾏完才会执⾏dispatch_group_notify函数⾥⾯的任务。

调度组和队列没有关系,只要是同⼀调度组就可以。

信号量dispatch_semaphore

dispatch_semaphore主要就是三个⽅法:

1. dispatch_semaphore_create(long value);这个函数是创建⼀个dispatch_semaphore_t类型的

信号量,并且创建的时候需要指定信号量的⼤⼩。

2. dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); 等待信

号量。如果信号量值为0,那么该函数就会⼀直等待,也就是不返回(相当于阻塞当前线

程),直到该函数等待的信号量的值⼤于等于1,该函数会对信号量的值进⾏减1操作,然后返

回。

3. dispatch_semaphore_signal(dispatch_semaphore_t deem); 发送信号量。该函数会对信号量

的值进⾏加1操作。

通过这三个⽅法,就能控制GCD的最⼤并发数量。

信号量在使⽤的时候需要注意: dispatch_semaphore_wait 和 dispatch_semaphore_signal ⼀定

要成对出现。因为在信号量释放的时候,如果dsema_orig初始信号量的⼤⼩⼤于dsema_value(通

过dispatch_semaphore_wait和dispatch_semaphore_signal改变之后的信号量的⼤⼩)就会触发崩

溃。

dispatch_source

dispatch_source是⽤来监听事件的,可以创建不同类型的dispatch_source来监听不同的事件。

dispatch_source可以监听的事件类型:

dispatch_source的具体⽤法:在任⼀线程上调⽤它的dispatch_source_merge_data函数,会执⾏

dispatch_source事先定义好的句柄(可以把句柄简单理解为⼀个block)。

dispatch_source的⼏个⽅法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值