两个线程交替输出0到100的奇偶数

412 阅读1分钟

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
}