一, 信号量的本质:
信号量的本质是数据操作锁, 它本身不具有数据交换的功能,而是通过控制其他的通信资源来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能.
二: 信号量的工作原理
由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:
P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行
V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.
特别注意 当信号为0(零),在执行 dispatch_semaphore_wait 语句时,信号量计数小于0 ,阻塞当前线程.
四: GCD的信号量应用场景: 控制最大并发量, 控制资源的同步访问,如数据访问,网络同步加载
信号量:就是一种可用来控制访问资源的数量的标识,设定了一个信号量,在线程访问之前,加上信号量的处理,则可告知系统按照我们指定的信号量数量来执行多个线程。
//创建信号量,参数:信号量的初值,如果小于0则会返回NULL
dispatch_semaphore_create(信号量值)
//等待降低信号量
dispatch_semaphore_wait(信号量,等待时间)
//提高信号量
dispatch_semaphore_signal(信号量)
//创建信号量,参数:信号量的初值,如果小于0则会返回NULL,也是开辟的线程数量
//当信号量值=线程数时,就是不限制线程执行
let s = DispatchSemaphore.init(value: 2)
//等待降低信号量,等待资源使用权
s.wait() 2-1
////提高信号量,释放资源使用权
s.signal() 2-1+1
//相对时间,当设备睡眠时,DispatchTime也就跟着睡眠
s.wait(timeout: DispatchTime.distantFuture) //distantFuture 一直等待下去
//绝对时间
s.wait(wallTimeout: DispatchWallTime.distantFuture)
用处:
多个线程对一个数据进行操作
多个任务之间进行协调,每个任务都是多线程的(在后台下载音乐、专辑的封面。等着两个都做完了,才通知用户可以去听音乐了。两个任务都是多线程,我们其实并不知道什么时候才能执行完毕。这个时候,就可以靠信号量,让大家互相等待。)










网友评论