在上述方案中描述下,在蘋果的文檔:
- 沒有緩衝區,因爲不需要緩衝;
- 系統負載是綁定的;
- 消費者是任務。
假設您有多個生產者和消費者,生產者將數據放入共享緩衝區,消費者從該共享緩衝區讀取數據。信號量或監視器用於同步對共享緩衝區的訪問,並且緩衝區大小是固定的,以便根據正在消耗的速率限制正在生成的數據量,從而限制生產者。
在Grand Central Dispatch下,消費者是派發到隊列的任務。由於任務是Objective-C塊,因此生產者不需要緩衝區來告知消費者應該處理的數據:Objective-C塊會自動捕獲它們引用的對象。
例如:
// Producer implementation
while (…) {
id dataProducedByTheProducer;
// Produce data and place it in dataProducedByTheProducer
dataProducedByTheProducer = …;
// Dispatch a new consumer task
dispatch_async(queue, ^{
// This task, which is an Objective-C block, is a consumer.
//
// Do something with dataProducedByTheProducer, which is
// the data that would otherwise be placed in the shared
// buffer of a traditional, semaphore-based producer-consumer
// implementation.
//
// Note that an Objective-C block automatically keeps a
// strong reference to any Objective-C object referenced
// inside of it, and the block releases said object when
// the block itself is released.
NSString *s = [dataProducedByTheProducer …];
});
}
生產者可以將盡可能多的消費者的任務,它可以產生數據。但是,這並不意味着GCD將以相同的速度觸發消費者任務。 GCD使用操作系統信息來控制根據當前系統負載執行的任務數量。生產者本身並沒有被限制,在大多數情況下,它不一定是因爲GCD的內在負載平衡。
如果實際需要扼制生產者,一種解決方案是讓主人調度生產者任務並讓每個消費者通知主人(通過在消費者完成其工作之後調度的任務)它已經結束,在這種情況下,主人會派遣另一個生產者任務。或者,消費者本身可以在完成後派遣生產者任務。
具體回答您已經解決的項目:
生產者 - 消費者問題也被稱爲有界緩衝區的問題,但上面沒有提到的緩衝
A的共享緩衝區是不需要的,因爲消費者是Objective-C塊,它會自動捕獲它們引用的數據。
其綁定
GCD界定根據當前系統負載的分派任務數目。
或消費者
消費者派往GCD隊列的任務。
更不用說爲了阻止生產者&消費者避免過/下運行
沒有必要阻止,因爲沒有共享緩存。由於每個消費者都是通過Objective-C塊上下文捕獲機制捕獲生成數據的Objective-C塊,因此消費者和數據之間存在一對一的關係。
但是在這種情況下,從性能命中的角度來看,有兩個線程同時運行生產者和消費者,在系統初始化期間啓動,或者在生產者有更多數據添加時調度異步線程(因爲調度一個線程也需要它自己的甜蜜時間)。 – Ichthyocentaurs
隊列是緩衝區。 –