GCD信号量:DispatchSemaphore
一、信号量简介
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。
二、说明
GCD 中的信号量是指__Dispatch Semaphore__,是持有计数的信号。类似于过高速路收费站的栏杆。可以通过时,打开栏杆,不可以通过时,关闭栏杆。在 Dispatch Semaphore 中,使用计数来完成这个功能,计数为0时等待,不可通过。计数为1或大于1时,计数减1且不等待,可通过。
Dispatch Semaphore 三个函数:
DispatchSemaphore(value: 5)
:创建一个Semaphore并初始化信号的总量semaphore.signal()
:发送一个信号,让信号量加1semaphore.wait()
:可以使总信号量减1,当信号量为0时就会一直等待(阻塞所在线程),否则就可以正常执行。
注意:信号量的使用前提是:想清楚你需要处理哪个线程等待(阻塞),又要哪个线程继续执行,然后使用信号量。
Dispatch Semaphore 在实际开发中主要用于:
- 保持线程同步,将异步执行任务转换为同步执行任务
- 保证线程安全,为线程加锁
三、代码示例
let semaphore = DispatchSemaphore(value: 5)
for i in 0..<90 {DispatchQueue.global().async {print("****** 任务 \(i) 线程:\(Thread.current)")semaphore.signal()}semaphore.wait()
}
print("****** end")
注意:.signal()
和 .wait()
是成对出现的