完整详解swift GCD系列(四)dispatch_semaphore(信号量)

完整详解swift GCD系列(四)dispatch_semaphore(信号量),第1张

概述原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=contents 一 何为信号量?   简单来说就是控制访问资源的数量,比如系统有两个资源可以被利用,同时有三个线程要访问,只能允许两个线程访问,第三个应当等待资源被释放后再访问。 注意:再GCD中,只有调度的线程在信号量不足的时候才会进入内核态进行线程阻塞 二 如何使用信号量 三个主要函

原创Blog,转载请注明出处

http://blog.csdn.net/hello_hwc?viewmode=contents


一 何为信号量?

简单来说就是控制访问资源的数量,比如系统有两个资源可以被利用,同时有三个线程要访问,只能允许两个线程访问,第三个应当等待资源被释放后再访问。

注意:再GCD中,只有调度的线程在信号量不足的时候才会进入内核态进行线程阻塞

二 如何使用信号量

三个主要函数

创建一个信号量

[plain] view plain copy funcdispatch_semaphore_create(_value:Int)->dispatch_semaphore_t! 其中value为信号量的初值,如果小于0则会返回NulL


提高信号量

copy funcdispatch_semaphore_signal(_dsema:dispatch_semaphore_t!)->Int
等待降低信号量

copy funcdispatch_semaphore_wait(_dsema:dispatch_semaphore_t!, _timeout:dispatch_time_t)->Int 注意,正常的使用顺序是先降低然后再提高,这两个函数通常成对使用。

三 举例分析

copy <prename="code">// //VIEwController.swift //SwiftTestExample // //Createdbyhuangwenchenon15/1/6. //copyright(c)2015年huangwenchen.Allrightsreserved. // importUIKit classVIEwController:UIVIEwController{ varsemaphore:dispatch_semaphore_t; requiredinit(coderaDecoder:NSCoder){ self.semaphore=dispatch_semaphore_create(1) super.init(coder:aDecoder) } overrIDefuncvIEwDIDLoad(){ super.vIEwDIDLoad() dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAulT,0),{()->VoIDin self.task_first() }) dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAulT,{()->VoIDin self.task_second() }) self.task_third() //DoanyadditionalsetupafterloadingthevIEw,typicallyfromanib. } functask_first(){ dispatch_semaphore_wait(self.semaphore,disPATCH_TIME_FOREVER) NSLog("%@","Firsttaskstarting") sleep(1) dispatch_semaphore_signal(self.semaphore) functask_second(){ dispatch_semaphore_wait(self.semaphore,disPATCH_TIME_FOREVER) NSLog("%@","Secondtaskstarting") sleep(1) dispatch_semaphore_signal(self.semaphore) functask_third(){ overrIDefuncdIDReceiveMemoryWarning(){ super.dIDReceiveMemoryWarning() //dispoSEOfanyresourcesthatcanberecreated. }

@H_44_301@ 这段代码模拟提交三个任务,提交到全局队列(并行队列)

当信号量的初初始为2时候

输出

[objc] copy 2015-01-0619:42:01.963SwiftTestExample[632:11631]Firsttaskstarting 2015-01-0619:42:01.964SwiftTestExample[632:11630]Secondtaskstarting 19:42:02.971SwiftTestExample[632:11630]Secondtaskisdone 19:42:02.971SwiftTestExample[632:11631]Firsttaskisdone 19:42:02.971SwiftTestExample[632:11633]ThrIDtaskstarting 19:42:03.974SwiftTestExample[632:11633]ThrIDtaskisdone 当信号量为3的时候

copy 19:42:49.912SwiftTestExample[666:12259]Firsttaskstarting 19:42:49.912SwiftTestExample[666:12258]Secondtaskstarting 19:42:49.912SwiftTestExample[666:12260]ThrIDtaskstarting 19:42:50.915SwiftTestExample[666:12259]Firsttaskisdone 19:42:50.915SwiftTestExample[666:12260]ThrIDtaskisdone 19:42:50.915SwiftTestExample[666:12258]Secondtaskisdone
当信号量为1的时候

copy 19:43:35.140SwiftTestExample[694:12768]Firsttaskstarting 19:43:36.145SwiftTestExample[694:12768]Firsttaskisdone 19:43:36.145SwiftTestExample[694:12771]Secondtaskstarting 19:43:37.146SwiftTestExample[694:12771]Secondtaskisdone 19:43:37.146SwiftTestExample[694:12769]ThrIDtaskstarting 19:43:38.150SwiftTestExample[694:12769]ThrIDtaskisdone 总结

以上是内存溢出为你收集整理的完整详解swift GCD系列(四)dispatch_semaphore(信号量)全部内容,希望文章能够帮你解决完整详解swift GCD系列(四)dispatch_semaphore(信号量)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1068934.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存