dispatch_semaphore (信号量)的使用姿势
2019-06-11 本文已影响0人
西门丨不吹雪
dispatch_semaphore
简单来说就是控制访问资源的数量,比如系统有两个资源可以被利用,同时有三个线程要访问,只能允许两个线程访问,第三个应当等待资源被释放后再访问,这时候就可以用dispatch_semaphore
。
注意:再GCD中,只有调度的线程在信号量不足的时候才会进入内核态进行线程阻塞
有关于dispatch_semaphore
的3个函数
1.创建一个信号量(内部参数为最大的信号计数)
dispatch_semaphore_t semaphore = dispatch_semaphore_create(long value)
2.提高信号量
dispatch_semaphore_signal(semaphore)
3.等待降低信号量 (后面一个为当前信号量不足时 等待的时间 一般写 DISPATCH_TIME_FOREVER
)
dispatch_semaphore_wait(<#dispatch_semaphore_t dsema#>, <#dispatch_time_t timeout#>)
使用方法
744065-4e837a473fe80c56.png控制台打印为
744065-d5b87f16c921cf45.png当最大信号量为1的时候 我们可以看到当前只允许一个线程进行访问 其余线程必须等待.
maxSignal
为2时
总结:
dispatch_semaphore_signal
是发送一个信号,自然会让信号总量加1 dispatch_semaphore_wait
等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制, 也可以保证线程安全.