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 & ...
随机推荐
- 【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢
我们这是可以正好借助之前学的factorybean类,自己吧jdbctemplate加载到spring容器中,我们可以封装多个这种对象,那么可以实现针对不同的数据库的jdbctemplate 首先我们 ...
- pycharm中可以运行脚本但是不能debug脚本
以前用的时候好好地,但是最近上班突然脚本就不能debug了,debug直接报错,如下所示 上网查过该有的原因: 1.在pycharm中两个地方设置成utf-8,页面右下角和File>settin ...
- 使用Jexus服务器运行Asp.Net Core2.0程序
前段时间写了篇关于.net core跨平台部署的文章.https://my.oschina.net/lichaoqiang/blog/1861977 主要讲述了,利用Nginx+CentOS+Supe ...
- ReentrantLock实现原理分析
ReentrantLock主要利用CAS+CLH队列来实现.它支持公平锁和非公平锁,两者的实现类似. CAS:Compare and Swap,比较并交换.CAS有3个操作数:内存值V.预期值A.要修 ...
- Mysql-8 配置主从复制(基于二进制日志)
目录 1. 实验环境 2. 安装MySQL8 3. 配置主从复制 4. 配置复制用户 5. 数据的同步 6. 配置从节点 7. 测试主从复制 1. 实验环境 System IP Host CentOS ...
- Python核心编程 | 浅谈闭包的使用
1.函数的引用 >>> def test(): print('test:') >>> test <function test at 0x10ffad488 ...
- Java第三方支付接入案例(支付宝)
开源项目链接 Kitty 开源权限管理系统 项目地址:https://gitee.com/liuge1988/kitty 演示地址:http://139.196.87.48:9002/kitty 用户 ...
- java ee期末项目相关
1.项目简介 本项目是对纸杯生产进行管理的的一个系统,从前端接收到订单,然后根据订单内容进行纸杯的生产.如下为该系统的总流程图: 1.项目系统架构图 3.系统用例图 4.ER图 主要的代码和相关文件见 ...
- 反射的所有api
Extension [ extension #17 Reflection version $Id: 1cf65cee164ed57874ce2d29e5c46b82f6139524 $ ] { - C ...
- Scala面向对象编程与类型系统
Scala支持面向对象编程, 其面向对象特性与Java有共同之处并添加了很多新的特性. 类定义 scala使用class关键字定义类: class MyComplex(real0:Double, im ...