最近总是忙着忙那,好久没动过笔了,
dispatch_semaphore_create,dispatch_semaphore_wait,dispatch_semaphore_signal在多线程中控制多线程的并发数目,也可以达到线程锁的功效,先大致的说下他们每个的作用.
dispatch_semaphore_create(long value):代表信号总量(信号就是你想每次执行几个任务)
dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout):等待信号,可以设置超时参数.如果信号量>0,那么会继续执行,并且总的信号量-1;如果信号量=0,则会阻塞当前的线程
dispatch_semaphore_signal(dispatch_semaphore_t dsema):通知信号,如果等待线程被唤醒则返回非0,否则返回0.并且会让信号总量+1.
下面说说用法
一.比如我现在想执行10个任务,休息两秒后呢,继续执行10各任务,再休息两秒,在执行...可以这么做(如图1.1):
1.1简单解释下上面图片中代码的意思:创建了一个初使值为3的semaphore,每一次for循环都会创建一个新的线程,线程结束的时候会发送一个信号,线程创建之前会信号等待,所以当同时创建了10个线程之后,for循环就会阻塞,等待有线程结束之后会增加一个信号才继续执行,如此就形成了对并发的控制,如上就是一个并发数为3的一个线程队列.
二:生产者---消费者模式
如图2.2
2.2简单说下上面代码:创建了两个并发队列,semaphore初始值设为1,两个队列的执行情况:1.生产队列执行到if时候,信号总量变为1,并生产了第一个蛋糕,并睡两秒,2.消费者队列执行到等待信号的时候,信号总量0,阻塞当前线程,一直等到消费者队列执行完通知信号是,信号总量变为1,继续执行,拿到了蛋糕,信号总量再次变为0.
三:应用简单示例:同步下载9张图片,下载完一张显示一张(线程锁的功能)
代码下面会附上demo,简单说下实现:首先把信号总量设为1,并创建了9个线程,每个线程负责现在一张图片,下载图片的时候开启等待信号,下载完成后更新界面,并发送通知信号
参考链接:http://www.iosxxx.com/blog/2016-06-02-GCD%E9%82%A3%E4%BA%9B%E4%BA%8B.html
网友评论