[英]MultiThreading in IOS Swift
我試圖並行運行兩個線程。 但不幸的是,它有時無法正常工作。 這是我的代碼
let firstQueue = DispatchQueue(label: "queue1", qos: DispatchQoS.userInitiated)
let secondQueue = DispatchQueue(label: "queue2", qos: DispatchQoS.userInitiated)
//let firstQueue = DispatchQueue(label: "queue1", qos: DispatchQoS.default , attributes: .concurrent)
firstQueue.async {
for i in 0..<10 {
print("🔷", i)
}
}
secondQueue.async {
for i in 20..<30 {
print("⚪️", i)
}
}
我嘗試了所有不同的方法,但沒有達到完美的並行性。 第一次輸出: 0 ⚪️ 20 🔷 1 ⚪️ 21 🔷 2 ⚪️ 22 🔷 3 ⚪️ 23 🔷 4 ⚪️ 24 🔷 5 ⚪️ 25 🔷 6 ⚪️ 26 🔷 7 ⚪️ 27 🔷 8 ⚪️ 28 🔷 9 ⚪️ 29
SecondTime輸出:
🔷0🔷1🔷2🔷3🔷4🔷5🔷6🔷7🔷8🔷9⚪️20⚪️21⚪️22⚪️23⚪️24⚪️25⚪️26⚪️27⚪️28⚪️29
您的代碼運行良好,但是您應該知道的是,您沒有選擇決定代碼的哪個部分首先執行的選擇,並且由於您的代碼只是打印一個字符並且為cpu做的輕松工作,因此您會看到有時您的字符打印是有序的,有時是無序的。 嘗試給CPU分配更多的工作,然后查看結果!
您可以使用DispatchGroup ,也應該閱讀有關GCD的更多信息,下面的代碼按預期工作,它將解決您的問題
let dispatchGroup = DispatchGroup()
let firstQueue = DispatchQueue(label: "queue1", qos: DispatchQoS.userInitiated)
let secondQueue = DispatchQueue(label: "queue2", qos: DispatchQoS.userInitiated)
firstQueue.async(group: dispatchGroup) {
for i in 0..<10 {
print("🔷", i)
}
dispatchGroup.leave()
}
secondQueue.async(group: dispatchGroup) {
dispatchGroup.wait()
for i in 20..<30 {
print("⚪️", i)
}
}
輸出總是像這樣🔷0🔷1🔷2🔷3🔷4🔷5🔷6🔷7🔷8🔷9⚪️20⚪️21⚪️22⚪️23⚪️24⚪️25⚪️26⚪️27⚪️28⚪️29
多線程的要點是,操作將並行且彼此獨立地完成。 那根本不保證任何順序,沒有同步,什么也沒有。 如果需要使事物同步,則將需要使用單個線程或使用第三個線程來分派工作:
func foo() {
let firstQueue = DispatchQueue(label: "queue1")
let secondQueue = DispatchQueue(label: "queue2")
let mainQueue = DispatchQueue(label: "queueMain")
var firstQueueOperationsCount: Int = 10
var secondQueueOperationsCount: Int = 10
func performOperations() {
guard max(firstQueueOperationsCount, secondQueueOperationsCount) > 0 else {
return
}
mainQueue.async {
if firstQueueOperationsCount > secondQueueOperationsCount {
firstQueueOperationsCount -= 1
firstQueue.async {
print("🔷")
performOperations()
}
} else {
secondQueueOperationsCount -= 1
secondQueue.async {
print("⚪️")
performOperations()
}
}
}
}
performOperations()
}
有很多方法可以序列化在多個線程上分派的任務,這只是其中之一。 您可以嘗試朝這個方向搜索/閱讀,但要清楚一點:您似乎對多線程所期望的不是“多線程”。 它不能以這種方式工作,也不應該以這種方式工作。 他們如何工作是我們希望它如何工作。
如果您遇到的情況更具體,我相信這里的社區可以幫助您找到解決問題的好方法。 但是從您編寫的內容來看,結果不是多線程而是:
for i in 0..<10 {
print("🔷")
print("⚪️")
}
它可能在另一個線程上分派,但實際上沒有什么區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.