1、信号量写法
多次尝试之后发现信号量写法最容易实现。
两次调用signal()是因为信号量释放的时候如果是wait状态系统会认为你是正在使用,会引起崩溃。
func twoThreadPrintABInOrderBySemaphore() {
print(#function)
var n = 0
let q1 = DispatchQueue(label: "q1")
let q2 = DispatchQueue(label: "q2")
let semaphore1 = DispatchSemaphore(value: 1)
let semaphore2 = DispatchSemaphore(value: 0)
DispatchQueue.global().async {
q1.async {
while n < 100 {
//打印奇数
semaphore1.wait()
print("q1 : n : \(n) thread: \(Thread.current)")
n += 1
semaphore2.signal()
}
semaphore1.signal()
semaphore2.signal()
}
q2.async {
while n < 100 {
//打印偶数
semaphore2.wait()
print("q2 : n : \(n); thread: \(Thread.current)")
n += 1
semaphore1.signal()
}
semaphore1.signal()
semaphore2.signal()
}
}// globle queue
}