簡體   English   中英

iOS Swift中的多線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM