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 & ...
随机推荐
- Linux下用ifconfig命令设置IP、掩码、网关
设置IP和掩码ifconfig eth0 192.168.1.240 netmask 255.255.255.0设置网关route add default gw 192.168.1.1 每日一言:靡不 ...
- linux下把动态链接库加入环境变量的几种方式
一. 将网络SDK各动态库路径加入到LD_LIBRARY_PATH环境变量 1.在终端输入:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/XXX 只在当前终端起作用 ...
- Hbase shell基本操作
1.启动cd <hbase_home>/bin$ ./start-hbase.sh 2.启动hbase shell # find hadoop-hbase dfs fileshadoop ...
- Spark 的 Shuffle过程介绍`
Spark的Shuffle过程介绍 Shuffle Writer Spark丰富了任务类型,有些任务之间数据流转不需要通过Shuffle,但是有些任务之间还是需要通过Shuffle来传递数据,比如wi ...
- [HAOI2017] 新型城市化
给出的图中恰包含2个团,则图的补图为一个二分图,其最大独立集为原图的最大团. 我们知道,二分图的最大独立集=V-最小顶点覆盖,最小顶点覆盖=最大匹配. 问题转化为:计算删去后最大匹配减小的边集. 所以 ...
- Asp.Net Core 发布异常 502.5 [The Application process failed to Start]
出现这个问题大部分时间都是因为发布时,少打包了一些文件.. 只打包了.Net Core的运行时库,没有打包Asp.Net Core 运行时.. 需要在打包指导文件中加入以下节点 <Propert ...
- (转)你真的会写单例模式吗——Java实现
http://www.runoob.com/design-pattern/singleton-pattern.html 单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好.用对单例模式, ...
- mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)
一.概述 二进制日志(binlog)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但是不包括数据查询语句, 语句以"事件"的形式保存,它描述了数据的更改过程, ...
- Java 容器源码分析之ConcurrentHashMap
深入浅出ConcurrentHashMap(1.8) 前言 HashMap是我们平时开发过程中用的比较多的集合,但它是非线程安全的,在涉及到多线程并发的情况,进行put操作有可能会引起死循环,导致CP ...
- 进程间通信IPC-信号
1,signal-ANSI C信号处理 #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal ...