iOS 多线程: 信号量

iOS 多线程同步策略之-----锁NSLock和@synchronized 1.NSLock---锁同步 - (void)viewDidLoad { [super viewDidLoad]; NSLock * lock = [[NSLock alloc]init]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [lock 阅读详情

今天跟大家聊聊关于 GCD 中的信号量的使用.

网上有很多关于信号量的介绍, 这里只是结合本人一些理解和实际使用来分享给大家.

在GCD中有三个函数是semaphore的操作,分别是

1.创建一个semaphore 
dispatch_semaphore_create
2. 发送一个信号 
dispatch_semaphore_signal
会使信号量计数增加1.
3. 等待信号
dispatch_semaphore_wait
会使信号量计数减少1.

/usr/include/dispatch/semaphore.h 中关于函数的声明和定义, 注释很清晰.

这里特别需要注意的几个问题:

  1. 创建信号量的函数
    dispatch_semaphore_t dispatch_semaphore_create(long value);
    函数需要传入一个大于或者等于0的值, 传入小于0的值, 函数返回 NULL.
  2. 等待信号函数
    long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
    返回0表示成功, 非0表示超时, 会继续执行该函数后面的语句.
    关于参数 timeout, 后面细说.
  3. 发送信号函数
    long dispatch_semaphore_signal(dispatch_semaphore_t dsema);
    返回非0值表示成功唤醒线程, 0表示没有唤醒.

下面结合实际应用场景, 说说信号量的使用和注意事项.

在开发过程中, 大家应该会有这样的需求

场景1:
等待上一个网络请求的返回结果, 再决定是否进行下一个网络请求.

示例代码:

dispatch_semaphore_t sema = dispatch_semaphore_create(0);  
[NetReq request:^(BOOL ok) {    
     // 唤醒等待的线程
   dispatch_semaphore_signal(sema);  
} onFail:^(int errorCode, NSString *errorMessage) {  
     // 唤醒等待的线程
   dispatch_semaphore_signal(sema);  
}];  

// 一直等待
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 

// 等待上面网络请求结束, 开始执行下面语句
[NetReq request...] 

场景2:
生产者和消费者问题

使用信号量可以解决该类型的问题.

示例代码

dispatch_semaphore_t signal = dispatch_semaphore_create(0);

if (NULL == signal) {
    return;
}

//消费者队列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
       while (true) {
            // 在超时时间内成功得到信号触发返回0值表示成功, 非0表示失败
            // 超时时间设置为DISPATCH_TIME_FOREVER, 表示一直等待, 其后语句被阻塞, 一直等到其被唤醒
            // DISPATCH_TIME_NOW, 表示不等待, 继续执行其后面的语句
            // 也可以指定时间, dispatch_time(DISPATCH_TIME_NOW, 10*NSEC_PER_SEC)), 表示10s内等待, 超过10s, 继续执行下面语句
            long result = dispatch_semaphore_wait(signal, DISPATCH_TIME_NOW);

            // 超时了
            if (result != 0)  {
                continue;
            }

            // 被唤醒
            NSLog(@"1....消费 %@", self.lockData);

            [self.lockData removeObjectAtIndex:0];
        }
    });

    // 这里可以阻塞一段时间, 延时增加信号量来看看消费者队列中 wait 的情况
    sleep(5);

//生产者队列   
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        while (true) {
            [self.lockData addObject:@"0"];
            NSLog(@"0-------产出: %@", self.lockData);

            // 使信号量加1, 返回非0表示成功, 0表示失败
            long result = dispatch_semaphore_signal(signal);

            //失败
            if (0 == result) {
                //wait for a while
                sleep(1);
                continue;
            }

            //成功
            //TODO:
        }
    });

关于超时参数的定义在注释中有详细说明.

现在你可以动手试一试了.

iOS 底层探索篇 —— GCD栅栏函数、信号量、调度组和Dispatch_Source iOS 底层探索篇 —— GCD栅栏函数、信号量、调度组和soure 阅读详情

相关推荐

Linux 进程控制与进程互斥(附源代码)(附实验报告)

1、利用fork函数创建新进程,并根据fork函数的返回值,判断自己是处于父进程还是子进程中; 2、在新创建的子进程中,使用exec类的函数启动另一程序的执行;分析多进程时系统的运行状态和输出结果; 3、利用最常用的三个函数pthread_create,pthread_join和pthread_exit编写了一个最简单的多线程程序。理解多线程的运行和输出情况; 4、利用信号量机制控制多线程的运行顺序,并实现多线程中数据的共享; 5、分析Linux系统下多进程与多线程中的区别。

iOS信号量详解

一、信号量的简单介绍: 1.信号量: 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量

程序猿老樊的博客 6291

Linux下多线程及多进程及同步与互斥编程详细介绍

Linux下多线程及多进程及同步与互斥编程详细介绍

iOS开发(OC)—— 信号量

iOS开发交流群:301058503 信号量在多线程中,用于保证在多个异步线程中同步执行 学习iOS的信号量,首先要了解几个关于信号量的API dispatch_semaphore_create:创建信号量 dispatch_semaphore_signal:释放信号量,使信号量+1 dispatch_semaphore_wait:阻塞,在信号量未释放之前(信号量<=0),不再继续执行下面的操作。注意,该操作会先把信号量-1 下面,看例子 1.下面创建一个异步线程,会先执行后面的打印NSLog(@

菜鸟历程 3027

grpc安装与简单demo测试

grpc安装: 由于工作需要,最近在学google的rpc开源框架;由于本人菜鸟一枚,而且是从Windows开发转到Linux;由于之前版本控制使用的是svn,没有使用过git,所以从GitHub上下载代码是通过浏览器下载zip格式的压缩文件,折腾了好几天了,发现了各种坑,各种缺少库,各种不知道怎么把这个库给装机器上。对于一个不熟悉Linux的人来说,这个体验简直糟糕透了。没办法了又在机器上装了...

old__captain的博客 4834

【libnice】meson + vs2022,生成win32工程

libnice

突围 947

iOS开发之GCD信号量dispatch_semaphore_t源码分析和使用

iOS中,信号量对于允许多个线程并发访问的资源,它是一个很好的选择。线程访问资源时,首先获取信号量,即创建信号量,然后等待将信号量的值减1。访问资源之后,线程释放信号量,将信号量的值加1。如果信号量的值大于0,则进程可以继续访问资源,并将信号量的值减1;如果信号量的值等于0,则进程会被阻塞,直到信号量的值变为正数。信号量的值可以是0、1或者n,表示可用资源的数量。‌(2)V(释放)操作‌:当一个进程或线程完成对共享资源的访问时,它会执行V操作,将信号量的值加1。1、信号量的基本概念和作用。

hbblzjy的博客 881

【DaVinci Developer专题】-41-APP SWC如何读取写入NVM Block数据

APP SWC Port如何Read读取/Write写入NVM Block数据; DaVinci Developer中的Calibration Parameter/Per-Instance Memory/Service Need如何配置。

「汽车电子助手」的博客 4486

iOS中的多线程开发技术第三篇之信号量(Semaphore)

在iOS开发中,信号量(Semaphore)是一种重要的同步机制,用于控制对共享资源的访问,确保多线程环境下的数据安全。本文将通过图文结合的方式,详细介绍信号量的基本概念以及用法。

我叫柱子哥 563

AI穿透式智慧粮仓

本报告基于 2025-2026 年全国多地智慧粮储实践案例,系统分析了 "AI + 穿透式" 智慧粮储体系的技术架构、AI 算法应用、提质增效成效、区域差异化特点及未来发展趋势。该体系通过多模态感知、智能算法与管控平台的深度融合,实现粮食存储全流程精准感知、智能预警与科学调控,显著降低储粮损耗与运营成本,大幅提升储粮安全水平与管理效率。报告梳理了各地差异化实践路径,提出针对性发展建议,为推动我国粮食仓储高质量发展、筑牢国家粮食安全防线提供参考。

reset2021的博客 233

echarts 饼图(加载进度条动画效果)

1、外侧动画细线效果运动“custom”自定义系列中“renderItem”属性来实现,动态修改起始角度和终止角度。2、圆环使用" pie "类型添加两个data值来画百分比圆环,动态修改data中的值。

God's asylum的博客 1633

iOS开发 多线程的高级应用-信号量semaphore

在iOS开发的道路上,多线程的重要性不言而喻. 大部分我们都停留在基础的使用上面.缺乏高级应用. 缺乏提升,是因为我们面对他太少,复杂的事情重复做,复杂的事务基础化. 差距就是这样拉开了 言归正传: 今天讲讲GCD的高级应用之信号量篇 一, 信号量的本质: 信号量的本质是数据操作锁, 它本身不具有数据交换的功能,而是通过控制其他的通信资源来实现进程间通信,它本身只是一种外部资源的标识。信号量...

十二指环的博客 1366

Python经典编程习题100例:第25例:求各个阶乘的和

不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述: 求1+2!+3!+…+20!的和。 解题思路: > 调用math模块中的factorial函数 代码: import math sum=0 for i in range(1,21): sum+=math.factorial(i) print(sum) ..

优快云 精品推荐 2736

iOS高级理论:多线程专题 - (2) GCD信号量的应

这样做的目的是保证在请求结果没有返回之前,一直让线程等待在那里,这样一个线程的任务一直在等待,就不会算作完成,notify的内容也就不会执行了,直到每个请求的结果都返回了,线程任务才能够结束,这时候notify也才能够执行。对计算机了解的都会知道信号量的作用,当我们多个线程要访问同一个资源的时候,往往会设置一个信号量,当信号量大于0的时候,新的线程可以去操作这个资源,操作时信号量-1,操作完后信号量+1,当信号量等于0的时候,必须等待,所以通过控制信号量,我们可以控制能够同时进行的并发数。

长沙火山 1584

海康威视嵌入式最全面试题及参考答案(3万字长文)

主营业务:提供包括前端摄像头、后端存储设备、显示控制设备等在内的全方位视频监控解决方案。市场地位:在全球范围内享有较高的市场份额,在安防领域具有较强的竞争力。技术创新:持续投入研发,拥有多项核心技术和专利,特别是在视频处理算法、人工智能等方面取得了显著成果。社会责任:积极参与公共安全项目,为智慧城市、交通管理等领域提供技术支持和服务。国际业务:除了国内市场外,海康威视的产品和服务也销往全球多个国家和地区。面向对象编程。

大模型大数据攻城狮的专栏 1765

YOLOv11 改进 - 特征融合 | 替换 C3k2 涨点:GELAN 融合 CSP+ELAN 提精度

本文介绍了可编程梯度信息(PGI)和广义高效层聚合网络(GELAN)与 YOLOv11 的结合,以解决深度网络数据传输时的信息丢失问题。PGI 能为目标任务提供完整输入信息,计算目标函数以更新网络权重。GELAN 作为轻量级网络架构,由 SPPELAN、ELAN1、RepNCSPELAN4 等模块组成。我们将 GELAN 代码集成进 YOLOv11, 实验脚本显示,结合 GELAN 的 YOLOv11 在 MS COCO 数据集目标检测任务中或有良好表现。

魔改工程师的博客 1243

ios 线程休眠_iOS笔记(一)GCD多线程:信号量和条件锁

1.信号量dispatch_semaphore_t在NSOperation中,可以直接设置最大并发数来控制并发数量,在GCD中,控制并发数量由信号量来完成。信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。在GCD中有三个函数是...

weixin_33891841的博客 395

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

iOS笔记(一)GCD多线程:信号量和条件锁

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34209851的博客 561

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

浅谈iOS @synchronized 锁用法

对于加锁解释以及iOS中多线程加锁方式@synchronized用法的简单讲解

Minecraft 5138

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

GCD 依次执行以及 NSOperationQueue 多线程

在iOS中,多线程使用较多的API是: NSOperationQueue 和 GCD 。其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实现的 OC的API,GCD使用方便,但代码较多,更致命的缺点如果是耗时操作,则无法取消任务,而NSOperationQueue则可以  问题1 : 如果有N个任务,如何使N个任务依次执行?? NSOper

jx_zls的博客 378

iOS-InterviewQuestion-collection多线程实战:GCD与NSOperationQueue完全指南

iOS开发中,多线程是提升App性能的核心技术。**GCD(Grand Central Dispatch)** 和**NSOperationQueue**作为iOS多线程编程的两大主流方案,掌握它们的使用技巧对开发者至关重要。本文将从实战角度出发,系统讲解两者的核心用法、适用场景及最佳实践,帮助你轻松应对面试与开发中的多线程难题。 ### 一、GCD:高效简洁的C语言多线程方案 GCD是苹果提供

gitblog_00151的博客 850

使用信号量来实现线程的先后执行顺序

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33743661的博客 1144

Watchdog源码深度剖析:从PingThread到DispatchSemaphore的完整实现原理

你是否曾经遇到过iOS应用卡顿、界面响应迟缓的问题?这些问题往往源于主线程被长时间阻塞。今天,我们将深入剖析**Watchdog源码**,这个强大的**主线程监控工具**如何通过PingThread和DispatchSemaphore机制来检测和报告主线程阻塞问题。对于iOS开发者来说,掌握Watchdog的实现原理不仅能帮助你更好地进行**性能优化**,还能让你深入理解多线程编程的精髓。🚀

gitblog_00766的博客 222

IO操作

IO 操作 :又叫 文件操作 文件操作分为: 从文件中读取内容,例如:视频文件,mp3 文件,文本文件。 往文件中写入内容。 危险的文件操作是: 线程A 从文件中读取内容的同时,线程B 往文件中写入内容。也就是同一时间段即读取文件,又写入文件。 这样的操作是 要杜绝的。 ...

M316625387的博客 866

为什么OCBarrage不卡?深度剖析iOS弹幕渲染引擎的3大核心性能策略

OCBarrage 是一款超高性能的 iOS 弹幕库(弹幕渲染引擎):底层用 Core Animation 驱动、Core Graphics 绘图、GPU 渲染,哪怕同时渲染 5000 条弹幕也依然流畅不卡,而且轻量、可拓展、高度自定义动画。本文带你深度剖析它背后的 3 大核心性能策略——GPU 驱动动画、cell 复用与视图图片化、轨道调度算法,帮助你在开发弹幕、直播、视频评论场景时,轻松搞定高

gitblog_00707的博客 192
上一篇: iOS AutoLayout: 从 XIB 中加载 UIViewController
下一篇: iOS 多线程: dispatch_barrier_async
veryitman
博客等级 码龄16年 472粉丝 310原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值