-
如果涉及到线程,线程间的同步、处理、线程一定涉及到线程锁。
-
在Swift中,GDC已经不再流行,使用起来虽然比较容易理解,但是流程和步骤确实比较麻烦。
-
新的包装DispatchQueue,DispatchSemaphore等等,已经非常之完善。可以用来控制线程同步和通讯。
-
严格来说,本次要讲的Semaphore,英文本意为:信号、信号量。就是类似线程安全的消息通讯机制。
-
使用起来非常简单。
let semaphore = DispatchSemaphore(value: 1)
let queue = DispatchQueue(label:"TestDispathQueue",attributes : .concurrent)
var arr = [Int]()
for i in 0..<10000 {
queue.async {
if semaphore.wait(timeout: .distantFuture) == .success {
arr.append(i)
semaphore.signal()
}
}
}
-
以上代码的意思是,开启10000个线程,每个线程干的活儿就是向数组中添加一个数字。
-
如果是不使用信号量的方式,上面的代码一定会报错,因为array本身是线程不安全的。
-
semaphore的使用方法主要就两个:wait、signal,wait的含义是信号量数量减一,signal的含义是信号量数量加一。
-
也即是说,signal是发信号,wait是等待后处理信号。
-
那么,以上代码中,1万个线程,同时开启获取信号量的方法,此时只有1个(DispatchSemaphore(value: 1)的含义是只有1个坑)线程立即获取执行权,其他线程全部都被卡在wait方法处。如果设置信号量总数为5,那么会有最多5个线程同时获取到执行权。
-
拿到执行权的线程,干完了自己的活儿之后,发送一个信号给其他所有线程。signal之后,可以获取执行权的线程数量就增加了1个,那么所有等待的线程中,就会有一个获取到执行权。如此反复。
-
这就是信号量的线程同步方式,巧妙使用wait、signal可以轻松实现生产者、消费者模式,轻松实现线程间的隔离和通讯。
-
同学们,学废了没有?
评论区