美文网首页
iOS 信号量

iOS 信号量

作者: d4d5907268a9 | 来源:发表于2024-01-15 18:24 被阅读0次

for循环内执行异步操作

for i in 0...10 {
    DispatchQueue.global().async {
        print("异步执行:\(i)")
    }
}

控制台打印如下,完全无序:

异步执行:3
异步执行:0
异步执行:2
异步执行:1
异步执行:5
异步执行:4
异步执行:10
异步执行:7
异步执行:8
异步执行:9
异步执行:6

增加信号量控制

let semaphore = DispatchSemaphore(value: 1) // 信号量1
for i in 0...10 {
    semaphore.wait()        // 信号量 -1
    DispatchQueue.global().async {
        print("异步执行:\(i)")
        semaphore.signal()  // 信号量 +1
    }
}  

此时控制台打印如下,异步操作有序执行:

异步执行:0
异步执行:1
异步执行:2
异步执行:3
异步执行:4
异步执行:5
异步执行:6
异步执行:7
异步执行:8
异步执行:9
异步执行:10

再看下面的代码:

for i in 0...10 {
    DispatchQueue.global().async {
        print("异步执行:\(i)")
    }
}
print("异步执行完成")

控制台打印如下,异步操作无序执行,且for循环外的代码先执行了:

异步执行完成
异步执行:3
异步执行:4
异步执行:5
异步执行:6
异步执行:7
异步执行:8
异步执行:0
异步执行:2
异步执行:9
异步执行:10
异步执行:1

按照前面提到的增加信号量控制

let semaphore = DispatchSemaphore(value: 1) // 信号量1
for i in 0...10 {
    semaphore.wait()        // 信号量 -1
    DispatchQueue.global().async {
        print("异步执行:\(i)")
        semaphore.signal()  // 信号量 +1
    }
}
print("异步执行完成")

此时的控制台打印如下:

异步执行:0
异步执行:1
异步执行:2
异步执行:3
异步执行:4
异步执行:5
异步执行:6
异步执行:7
异步执行:8
异步执行:9
异步执行完成
异步执行:10

细心观察会发现,异步操作全部有序执行。但是for循环外的代码会在最后一次信号量之前执行。

我们在此基础上再做些改动,将for循环外的代码也用信号量控制起来:

let semaphore = DispatchSemaphore(value: 1) // 信号量1
for i in 0...10 {
    semaphore.wait()        // 信号量 -1
    DispatchQueue.global().async {
        print("异步执行:\(i)")
        semaphore.signal()  // 信号量 +1
    }
}

semaphore.wait()        // 信号量 -1
print("异步执行完成")
semaphore.signal()  // 信号量 +1

此时的控制台打印如下:

异步执行:0
异步执行:1
异步执行:2
异步执行:3
异步执行:4
异步执行:5
异步执行:6
异步执行:7
异步执行:8
异步执行:9
异步执行:10
异步执行完成

到这里,聪明的你一定发现哪里不同

相关文章

网友评论

      本文标题:iOS 信号量

      本文链接:https://www.haomeiwen.com/subject/pduhodtx.html