ios开发GCD(2)-dispatch_semaphore_t信号量计数器

思考:现在有多个线程异步执行,我们想要同时最多只能执行2个或n个,该怎么办?

dispatch_semaphore_t

看代码解析:

    NSLog(@"开始");
    dispatch_semaphore_t t = dispatch_semaphore_create(2);//设置信号量初始值

    dispatch_async(dispatch_queue_create("one", DISPATCH_QUEUE_CONCURRENT), ^{
        dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。

        //要执行的操作
        NSLog(@"任务1=%@",[NSThread currentThread]);
        sleep(5);

        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(5);

        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
    });

看打印结果:

2018-10-16 14:05:48.148321+0800 NSThread-GCD-NSOperation[5280:2575154] 开始
2018-10-16 14:05:48.150346+0800 NSThread-GCD-NSOperation[5280:2575369] 任务1=<NSThread: 0x1c0279a40>{number = 3, name = (null)}
2018-10-16 14:05:48.150867+0800 NSThread-GCD-NSOperation[5280:2575278] 任务2=<NSThread: 0x1c447ee00>{number = 4, name = (null)}
2018-10-16 14:05:53.152640+0800 NSThread-GCD-NSOperation[5280:2575371] 任务3=<NSThread: 0x1c046bd00>{number = 5, name = (null)}
2018-10-16 14:05:53.152729+0800 NSThread-GCD-NSOperation[5280:2575372] 任务4=<NSThread: 0x1c4476440>{number = 6, name = (null)}

解析:

这里有4个线程异步执行,正常情况下,是同时执行的,不分先后;

这里将信号量设为2,说明同时只能执行2个任务。

代码执行到任务1,信号量-1,这时信号量=1;因为我们设置的同时可以执行2个任务,所以任务2此时也可以执行,代码执行到任务2时,信号量继续-1,此时信号量=0;因为前两个任务都是耗时操作,任务不完成,导致信号量不释放出来(+1),所以后面的异步线程不会执行;只有当前面的有任务完成,信号量+1,这时监测到信号量>0,才会执行后面的任务。

由打印结果可以看到,任务3和4打印时间比任务1和2迟了5秒。

原文地址:https://www.cnblogs.com/lfyDragon/p/9797783.html

时间: 2024-10-13 21:16:51

ios开发GCD(2)-dispatch_semaphore_t信号量计数器的相关文章

IOS开发 GCD介绍: 基本概念和Dispatch Queue

iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØNSOperation/NSOperationQueue 面向对象的线程技术 ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Appl

精通IOS开发-GCD和后台处理

一些生命周期函数的调用时间 打开应用时,调用 applicationWillEnterForeground: applicationDidBecomeActive: 按Home键,调用 applicationWillResignActive: applicationDidEnterBackground: 双击Home键,向上滑动关闭程序,调用 applicationWillTerminate: 状态保存和回复机制参考 http://developer.apple.com/library/ios/

iOS开发GCD的简单使用

- (void)viewDidLoad { [super viewDidLoad]; // gcd 可以充分调用设备的 cpu 发挥最大性能,在 C 语言基础之上封装的 // dispatch_queue_t开辟一个线程 // DISPATCH_QUEUE_PRIORITY_DEFAULT设置优先级 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 在此线程里开启异

IOS开发之多线程 -- GCD的方方面面

前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现给读者,同时也是讲大神博客中有的深涩的理论理解的通熟易懂转述给读者,已经是尽可能的让读者深入理解和掌握多线程的知识以及GCD的使用技术.最后的附录中,我将会给出所有本人阅读的大神写的关于多线程或者是GCD的文章链接,大家感兴趣的,可以去参考和学习.也许,看我的这篇就够了,因为我就是参考他们的,嘻嘻.

iOS开发之多线程技术——GCD篇

本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & Asynchronous 同步 & 异步 二.Serial Queues & Concurrent Queues 串行 & 并发 三.Global Queues全局队列 四.Main Queue主队列 五.同步的作用 六.dispatch_time延迟操作 七.线程安全(单例dispa

iOS开发笔记5:多线程之NSThread、NSOperation及GCD

这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread.NSOperation及GCD三种方式,常用GCD及NSOperation. 1.NSThread 创建线程主要有以下三种方式 需要注意的是对于多个线程可能同时访问一个对象的时候,使用“@synchronized”来解决这类线程同步问题. 在子线程中通知主线程通常使用以下两种办法: 2.NSOperation NSOperation有三种使用方式,分别是NSInvocationOperation.NSBlockOpera

iOS开发——多线程OC篇&amp;GCD实用总结

GCD实用总结 图片下载 注:iOS开发中常见GCD的实用也就这些了, 先来看看之前我们经常使用的方式: 1 static NSOperationQueue * queue; 2 3 - (IBAction)someClick:(id)sender { 4 self.indicator.hidden = NO; 5 [self.indicator startAnimating]; 6 queue = [[NSOperationQueue alloc] init]; 7 NSInvocationO

iOS开发:深入理解GCD 第一篇

最近把其他书籍都放下了,主要是在研究GCD.如果是为了工作,以我以前所学的GCD.NSOperation等知识已经足够用了,但学习并不仅仅知识满足于用它,要知其然.并且知其所以然,这样才可以不断的提高自身技术水平. 本文主要参考http://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1 和 <iOS与OS X 多线程和内存管理>,以及其他一些杂七杂八的书籍或者博客. GCD已经面世很久了,基于GCD面向对象

iOS开发多线程篇 05 —GCD介绍

iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中