多线程之使用信号量

本文介绍了信号量在多线程中的使用,包括创建、等待和释放信号的原理。信号量可用于控制并发任务数量和封装异步回传为同步操作。在实际应用中,要注意避免在主线程中阻塞造成卡顿,推荐在其他线程中使用。
摘要由CSDN通过智能技术生成

引言

信号量作为GCD的一部分,常用于多线程或任务间协作,当一个任务的执行过程中需要依赖另一个任务时即可使用信号量。

实现原理

信号量通过信号计数来实现。其使用即计数过程可分为三个部分:创建信号量、等待信号与释放信号。

  • 创建信号量
    函数为dispatch_semaphore_t dispatch_semaphore_create( long value),可指定信号的初始数量。

  • 等待信号
    函数为dispatch_semaphore_wait( dispatch_semaphore_t dsema, dispatch_time_t timeout),可指定等待的信号量和超时时间。
    每执行一次等待信号,信号数量减1;当结果信号数量大于等于0时直接通过执行后续代码;当信号数量小于0时锁住当前线程,等待信号释放或超时才能执行后续代码。

  • 释放信号
    函数为dispatch_semaphore_signal(dispatch_semaphore_t deem),可指定释放的信号量。
    每次释放信号,该信号量的信号数量加1;此时如有等待信号的线程则可通过继续执行。

信号量的应用

常见的信号量应用模式可以总结为:
1. 用初始信号数量控制并发任务数量
2. 将异步回传方法封装成同步回传方法

这里我们讲一下第二种,定义一个通过计算获取值的类,其对外的函数可以直接返回结算值,而内部的实现则需要调用计算类的计算方法并通过代理方法返回结果。
这种情况下,可以在对外的函数实现内锁住线程等待信号,并在回调函数内获取计算值释放信号,然后再从对外函数里返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值