iOS 多執行緒 同步和非同步 序列和並行

2021-08-21 06:25:03 字數 2510 閱讀 8696

ios中我們常使用dispatch_queue和nsoperationqueue來實現多執行緒。而序列和並行、同步和非同步,這四個詞同時出現的地方是dispatch_queue。nsoperationqueue貼心的隱藏了這些東西,已經不需要我們來操心了。所以下面會使用dispatch_queue來展開。

執行緒,執行緒是程式執行流的最小單元。

序列佇列,後乙個任務等待前一任務結束後再執行,按新增順序乙個乙個執行。

並行佇列,後乙個任務不會等待前乙個任務,不等前乙個任務完成就會分配新任務。

序列和並行,這裡對應的是佇列的概念。佇列負責管理多個任務,佇列擁有乙個執行緒池,池子裡有乙個或者多個執行緒,它按要求將每個任務排程到某乙個執行緒執行。

拋開同步非同步,首先來建立乙個佇列 dispatch_queue_t ,dispatch_queue_serial、

dispatch_queue_concurrent

分別對應序列和並行

dispatch_queue_t serialqueue = dispatch_queue_create("my.serialqueue", dispatch_queue_serial);

dispatch_queue_t concurrentqueue = dispatch_queue_create("my.concurrentqueue", dispatch_queue_concurrent);

然後再來說一下dispatch_sync

和dispatch_async

。同步和非同步在這裡是執行緒概念,同步不會建立新的執行緒,會阻塞當前的執行緒在這個執行緒裡執行任務。而非同步則不會阻塞當前執行緒,會選擇在恰當的時機在當前執行緒或者另開執行緒執行任務(看系統如何排程),開始任務和完成任務時間是不確定的。

在viewdidload裡加新增**run

首先看到viewdidload是mainqueue來排程來的任務,而mainqueue是序列的(serial)。

這裡不能使用dispatch_sync(main,^{});序列佇列同步任務中(向同乙個序列佇列新增同步任務),進行中的任務等待新增任務完成,新增的任務等待上乙個任務完成,因為相互等待死迴圈。在currentqueue中謹慎使用dispatch_sync;

因為是同步,任務都被分配到了主線程,同步任務會阻塞當前執行緒,所以順序一定是1234。

再把serialqueue換成concurrentqueue,依然用sync同步,得到的結果是1234。同步只會在當前執行緒(只有乙個執行緒)同時阻塞執行緒,並行佇列失去意義,結果和序列佇列一樣都是乙個乙個順序執行。  

上述**,我們將sync換成async非同步,依然是serialqueue序列佇列。得到結果2413、2143、1234。

序列佇列,乙個乙個執行,

那麼1肯定在3前面。而非同步操作不會阻塞執行緒,1、3和2、4之間的位置是不確定的;另外補充,序列非同步情況下,序列乙個乙個執行,那麼非同步一次分配乙個執行緒就足夠了(佇列可以把任務提交到不同的執行緒,但序列同時存在的只有乙個任務也就是乙個執行緒)。

上述**,換成非同步並行

可見因為非同步,1、3分別被分配到了執行緒thread 5、4中執行,(具體分配到哪個執行緒是不確定的)。

得到結果可能是13,也可能是31,因為是並行佇列,不會等待上乙個任務完成,非同步的執行又是不確定時間的,所以1和3的順序是不確定的。    

多執行緒中同步和非同步?

執行緒同步 多個執行緒同時訪問同一資源,等待資源訪問結束,浪費時間,效率低 執行緒非同步 訪問資源時在空閒等待時同時訪問其他資源,實現多執行緒機制 非同步處理就是,你現在問我問題,我可以不回答你,等我用時間了再處理你這個問題.同步不就反之了,同步資訊被立即處理 直到資訊處理完成才返回訊息控制代碼 非...

執行緒同步和非同步

執行緒同步和執行緒非同步有什麼區別?重要基礎知識 打個比方,如果你在等乙個人,同步的時候,你會一直等到她來了之後才做其他事情,這個過程除了等待你啥都不會做,非同步的時候,你一邊在等,可能一邊玩遊戲或者是看報紙什麼的,一直到她到來,你的等待狀態才會結束 在實現上,同步的過程會阻塞程序的所有其他操作,將...

執行緒同步和非同步

執行緒同步 是多個執行緒同時訪問同一資源,等待資源訪問結束,浪費時間,效率低 執行緒非同步 訪問資源時在空閒等待時同時訪問其他資源,實現多執行緒機制 非同步處理就是,你現在問我問題,我可以不回答你,等我用時間了再處理你這個問題.同步不就反之了,同步資訊被立即處理 直到資訊處理完成才返回訊息控制代碼 ...