就我所瞭解的非主隊列GCD隊列而言,它們僅在具有單核CPU的設備上默認串行。但是如果一個設備具有多個內核,則可能會發生隊列中的塊同時執行。如何創建始終串行的GCD隊列,即使在多核CPU上?
我想使用串行GCD隊列來克服一些併發問題,即使有多個內核,此隊列也必須是串行的。
開發人員提到這是可能的。我將如何創建這樣一個總是連續的隊列?
就我所瞭解的非主隊列GCD隊列而言,它們僅在具有單核CPU的設備上默認串行。但是如果一個設備具有多個內核,則可能會發生隊列中的塊同時執行。如何創建始終串行的GCD隊列,即使在多核CPU上?
我想使用串行GCD隊列來克服一些併發問題,即使有多個內核,此隊列也必須是串行的。
開發人員提到這是可能的。我將如何創建這樣一個總是連續的隊列?
可以使用dispatch_get_global_queue
函數獲得的標準GCD隊列確實是併發的。
但您可以使用dispatch_queue_create函數創建自定義gcd隊列。通過DISPATCH_QUEUE_SERIAL
作爲第二個參數來創建隊列作爲串行。
無論有多少個CPU核心,DISPATCH_QUEUE_SERIAL都會是串行的?我擔心它可能是以每個核心爲基礎的序列,但不完全是。你有多確定這是訣竅? – 2012-08-15 12:45:54
@InternationalFrog,確保一個接一個地執行任務是串行隊列的主要目的,所以我認爲無論內核的數量如何,你都應該沒問題。 – Vladimir 2012-08-15 12:52:49
@InternationalFrog - 是的,使用'dispatch_queue_create()'創建的串行隊列可以保證在執行時串行,無論內核的數量如何。它們中的塊可能運行在不同的線程上,但它們將一直執行一個。我在幾個地方使用這種方法來實現廉價的共享資源鎖定。 – 2012-08-15 16:23:14
要創建併發隊列:
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.aj.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
要創建序列隊列:
dispatch_queue_t serialQueue = dispatch_queue_create("com.aj.serial.queue", DISPATCH_QUEUE_SERIAL);
回答在http://stackoverflow.com/questions/5026043/concurrency-and-serial-queues-in -Grand-中央調度。在您的GCD隊列中使用dispatch_sync – CSmith 2012-08-15 12:20:51
@CSmith Nope。這是同步的,而不是串行的。如果您在隊列中有一個異步任務,它可能會與您的同步塊同時運行。 – 2012-08-15 12:25:17
@CSmith還有,如果有問題的隊列是一個全局併發隊列,那麼dispatch_sync就相當於dispatch_async,所以在那裏也不行。 – jkh 2012-08-15 20:32:30