GCD--补充

作者: Small_Potato | 来源:发表于2016-07-27 09:29 被阅读205次

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

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

相关文章

  • GCD--补充

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

  • GCD--同步执行

    在实际开发中,我们需要按顺序执行一些异步的任务,我们应该怎么做呢? 答案是:dispatch_group_noti...

  • swift笔记:函数补充,枚举补充,属性补充,继承补充

    关键字inout 这个例子是在playground下写的 inout这个形参接收的相当于接收的是结构体变量的地址,...

  • 补充

    一脸倦容的老先生倚靠在凳子上,一手举着茶壶,一手扇着扇子,背后支着面脏得看不清本色的旗子,上面歪歪扭扭地写着“卜”...

  • 补充

    1.生命周期 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂...

  • 补充

  • 补充

    让心很自然的平静下来,不再受外界的打扰,抛开生活中所有的烦恼,放下社会中的地位,将注意力让着我们的身体上,有内而外...

  • 补充

    v-html 可以识别html标签v-text 不可以识别html标签 v-once 只绑定一次v-pre ...

  • 补充

  • 补充

网友评论

本文标题:GCD--补充

本文链接:https://www.haomeiwen.com/subject/clonjttx.html