2012-09-09 55 views
1

關於IOS全局隊列,這是一個好主意,我們可以通過子線程利用它來利用多核CPU,但是現在我的問題是如何在從隊列中派發這些子線程後如何管理這些子線程?似乎Apple不提供這樣的API。關於IOS中的全局隊列。

例如,我創建了一個串行隊列,對於一個工作因爲某種原因被阻塞的情況,那麼整個隊列也將被阻塞。事實上,我們想要管理這項工作,目前看來目前還沒有找到任何方法。

任何討論將不勝感激,在此先感謝。

回答

2

一旦塊被分派到隊列中,它就會執行。沒有API來阻止它。

您可以suspend隊列,這將導致掛起的塊不執行,直到隊列被恢復。但是,沒有辦法阻止塊。

傳統的方法是在你的代碼中有一個「檢查」,看看運行的程序段是否應該儘早停下來。

// return early from block 
if (shouldStop) return; 

請注意,您看到的「問題」是串行隊列的確切定義。它只允許操作按照提交隊列的順序進行處理。你必須等待你前面的完成。

您也可以查看NSOperationQueue,它提供了一個更容易的機制來取消正在隊列中等待的塊,但停止正在執行的塊的唯一方法是讓您在塊中實現該機制。

如果你發現你不得不取消大量的「阻塞」塊,那麼你的設計很可能是有缺陷的,你需要重新審視你的設計。此外,如果等待中的任務「不在」等待該任務,那麼爲什麼要將它們放在串行隊列中呢?使用併發隊列或單獨的串行隊列或其他機制。

現在,讓我說明你應該不使用調度隊列來阻止I/O操作。你可以做到這一點,通常它是最簡單的,但是如果你想爲你的應用程序提供最好的性能特徵,你應該使用dispatch_io,它可以更好地集成到其他CPU密集型線程中。

我想這裏的大賣點應該是,而不是嘗試得到像「當前運行的塊被阻止時,如何在串行隊列上運行塊的問題」等答案。你應該問自己怎樣才能更好地設計你的應用程序,以便你沒有這種情況。

如果工作不必執行,那就不要等待。如果工作必須完成,他們只需等待......

+0

謝謝你,我承認我的原創設計真的需要重新審視。 – jianhua

+0

從課程中學習,在做出最終決定之前考慮更多的案例。最後我們使用NSOoperationQueue。 – jianhua

0

如果您需要對後臺隊列進行更好的控制,而不是使用GCD和全局隊列,請檢查NSOperationQueue,它提供了一個cancelAllOperations方法。我認爲你使用全局隊列是因爲你想要併發後臺任務,在這種情況下,你可以檢查setMaxConcurrentOperationCountNSOperationQueue,它可以讓你定義隊列爲併發。

有關操作隊列的更多詳細信息,請參閱Concurrency Programming Guide

+0

謝謝你,請考慮NSOperationQueue然後重新設計。 – jianhua

+1

NSOoperation和NSOoperationQueue比GCD更有效地管理插入的作業。 – jianhua

0

我認爲你需要的是爲你的任務創建你自己的隊列,並使其併發並設置優先級,如果你想。所以你的任務不會被阻止。

let queueAttr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_CONCURRENT, QOS_CLASS_USER_INITIATED, 0) 

let callbackQueue = dispatch_queue_create("myqueue", queueAttr)