GCD--补充

最近总是忙着忙那,好久没动过笔了,

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个线程,每个线程负责现在一张图片,下载图片的时候开启等待信号,下载完成后更新界面,并发送通知信号

最后附上demo 


参考链接:http://www.iosxxx.com/blog/2016-06-02-GCD%E9%82%A3%E4%BA%9B%E4%BA%8B.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、多线程简介: 所谓多线程是指一个 进程 -- process(可以理解为系统中正在运行的一个应用程序)中可以开...
    寻形觅影阅读 1,081评论 0 6
  • GCD笔记 总结一下多线程部分,最强大的无疑是GCD,那么先从这一块部分讲起. Dispatch Queue的种类...
    jins_1990阅读 784评论 0 1
  • 2013-1-24 天晴,无雨,收拾完东西的叶晴拉开宿舍的窗帘,阳光赤裸裸地洒下一片,像是久居暗室的囚犯,叶晴习惯...
    沐少安阅读 355评论 0 2
  • 嗨,早,各位朋友。又是美好的一天。今天我想给大家聊聊如何让PPT具有立体美感。之前我们说了如何让PPT具有美感的方...
    职场思考派阿来阅读 1,885评论 0 10
  • 忙碌了一上午微信发来他的信息,他说 我想,我们还是做回朋友吧。对不起,目前的我没有心思去开始一段感情,这样的状态一...
    宁一子阅读 156评论 0 0