ios开发GCD(2)-dispatch_semaphore_t信号量计数器
思考:现在有多个线程异步执行,我们想要同时最多只能执行2个或n个,该怎么办?
dispatch_semaphore_t
看代码解析:
NSLog(@"开始");
dispatch_semaphore_t t = dispatch_semaphore_create();//设置信号量初始值 dispatch_async(dispatch_queue_create("one", DISPATCH_QUEUE_CONCURRENT), ^{
dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。 //要执行的操作
NSLog(@"任务1=%@",[NSThread currentThread]);
sleep(); dispatch_semaphore_signal(t);//任务完成,信号量+1
}); dispatch_async(dispatch_queue_create("two", DISPATCH_QUEUE_CONCURRENT), ^{
dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。 //要执行的操作
NSLog(@"任务2=%@",[NSThread currentThread]);
sleep(); dispatch_semaphore_signal(t);//任务完成,信号量+1
}); dispatch_async(dispatch_queue_create("three", DISPATCH_QUEUE_CONCURRENT), ^{
dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。 //要执行的操作
NSLog(@"任务3=%@",[NSThread currentThread]);
dispatch_semaphore_signal(t);//任务完成,信号量+1
}); dispatch_async(dispatch_queue_create("four", DISPATCH_QUEUE_CONCURRENT), ^{
dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。 //要执行的操作
NSLog(@"任务4=%@",[NSThread currentThread]);
dispatch_semaphore_signal(t);//任务完成,信号量+1
});
看打印结果:
-- ::48.148321+ NSThread-GCD-NSOperation[:] 开始
-- ::48.150346+ NSThread-GCD-NSOperation[:] 任务1=<NSThread: 0x1c0279a40>{number = , name = (null)}
-- ::48.150867+ NSThread-GCD-NSOperation[:] 任务2=<NSThread: 0x1c447ee00>{number = , name = (null)}
-- ::53.152640+ NSThread-GCD-NSOperation[:] 任务3=<NSThread: 0x1c046bd00>{number = , name = (null)}
-- ::53.152729+ NSThread-GCD-NSOperation[:] 任务4=<NSThread: 0x1c4476440>{number = , name = (null)}
解析:
这里有4个线程异步执行,正常情况下,是同时执行的,不分先后;
这里将信号量设为2,说明同时只能执行2个任务。
代码执行到任务1,信号量-1,这时信号量=1;因为我们设置的同时可以执行2个任务,所以任务2此时也可以执行,代码执行到任务2时,信号量继续-1,此时信号量=0;因为前两个任务都是耗时操作,任务不完成,导致信号量不释放出来(+1),所以后面的异步线程不会执行;只有当前面的有任务完成,信号量+1,这时监测到信号量>0,才会执行后面的任务。
由打印结果可以看到,任务3和4打印时间比任务1和2迟了5秒。
ios开发GCD(2)-dispatch_semaphore_t信号量计数器的更多相关文章
- ios开发--GCD使用介绍:4-延迟执行操作
在开发过程中,我们有时会希望把一些操作封装起来延迟一段时间后再执行.iOS开发中,有两种常用的方法可以实现延迟执行,一种是使用GCD,另外一种是使用NSRunLoop类中提供的方法. 1.使用GCD实 ...
- IOS开发GCD小结
0. Brief Introduction GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制.它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后 ...
- iOS开发——GCD多线程详解
GCD多线程详解 1. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程 ...
- IOS开发 GCD介绍: 基本概念和Dispatch Queue
iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...
- iOS开发-GCD和后台处理
一些生命周期函数的调用时间 打开应用时,调用 applicationWillEnterForeground: applicationDidBecomeActive: 按Home键,调用 applica ...
- iOS开发——GCD总结
Grand Central Dispatch,简称GCD,在异步执行任务的技术之一. 一般将应用程序中记述的线程管理用的代码在系统级中实现,开发者只需要定义想执行的任务并追加到适当的Dispatch ...
- iOS开发GCD的简单使用
- (void)viewDidLoad { [super viewDidLoad]; // gcd 可以充分调用设备的 cpu 发挥最大性能,在 C 语言基础之上封装的 // dispatch_que ...
- iOS开发GCD(3)-数据安全
/* 多个线程可能访问同一块资源,造成数据错乱和数据安全问题 为代码添加同步锁(互斥锁) */ -(void)synchronized{ @synchronized(self){ //需要锁住的代码, ...
- iOS开发之多线程技术——GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
随机推荐
- 用DDD模拟案例分析
之前我写了几篇关于DDD的介绍和一些小例子说明,我想这对于介绍DDD还是有些模糊,甚至还不知道怎么用DDD来分析设计.昨天和园友讨论也发现没有例子很难说明,所以今天我模拟了一个案例,同时这个案例也是真 ...
- Python内置类型(5)--迭代器类型
指能够被内置函数next调用并不断返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值的对象称为迭代器(Iterator) 其实以上的说法只是侠义上的迭代器的定义,在pyt ...
- li内有span需要右浮的问题
图一和图二换了一下span的位置,但是其页面展示是一样的,兼容性比较好的是第二种
- .net core使用NLog+Elasticsearch记录日志
在微服务或分布式系统中,如果将日志作为文件输出,查看系统日志将非常不便:如果将日志保存到数据库中,又不能进行全文搜索.在这里我们将日志输出到ElasticSearch中,借助Kibana再查找日志. ...
- JavaSE-关键字final
final修饰数据: final修饰基本数据类型,使数值恒定不变,修饰对象引用,final使引用恒定不变 final修饰的成员变量必须要被初识化 final可以修饰方法中的参数列表,被修饰的参数无法在 ...
- PowerShell 连接远程服务器
>>服务端Enable-PSRemoting winrm quickconfig ————这个可能不需要 >>客户端Set-Item wsman:\localhost\Clie ...
- 自动生成getter setter
如何使用java黑魔法给一个entity生成getter,setter方法? 由于java是一门静态语言,要给一个类动态添加方法,看似是不可能的.但牛B的程序员会让任何事情发生.我只知道有两种方式可以 ...
- (转)关于CNN中平移不变性的理解
https://www.quora.com/Why-and-how-are-convolutional-neural-networks-translation-invariant https://st ...
- PostgreSQL事务实现
事务简介 事务管理器:有限状态机 日志管理器 CLOG:事务的执行结果 XLOG:undo/redo日志 锁管理器:实现并发控制,读阶段采用MVCC,写阶段采用锁控制实现不同的隔离级别 Postgre ...
- Tirgger SimpleTrigger CronTrigger(四)
触发器通用属性: jobKey:表示job实例的标识,触发器被触发时,指定的job实例会被执行. startTime:表示触发器的时间表 首次被触发的时间,他的值类型为java.uti.Date. e ...