2014-01-17 61 views
2

我想要創建一個線程或任務(確切地說有多個),並執行一些非CPU密集型工作,這會由於外部原因(如HTTP請求或文件IO操作)而花費大量時間。慢速磁盤。我可以用C#中的異步等待來做到這一點,而這正是我在這裏要做的。產生一個線程或任務,讓它做它自己的事情,而我繼續執行該程序,只要讓它在任何準備就緒的時候返回結果。 TBB存在的問題是我所能做的所有任務都認爲它們是爲CPU密集型工作而創建的。如何在英特爾®TBB中有漫長的等待線程?

是什麼TBB調用GUI線程我想在這種情況下?我需要不止一個,這是可能的嗎?你能指點我正確的方向嗎?我應該尋找另一個提供線程的庫,並可用於多個操作系統嗎?

+0

我可以輕鬆創建線程和任務,但我無法讓他們明白他們不應該壟斷CPU,而是儘可能輕地工作,因爲他們的工作主要是坐在那裏等待可能需要的外部響應幾百毫秒。我說那已經在上面的問題裏面了。 Tltr:threads/task/???對於非CPU密集型任務。如何做到這一點,在哪裏可以找到信息。 – SMeyers

+0

如果應該只是在等待,那麼它根本不應該使用CPU,無論使用的是什麼線程模型。你在等什麼?你最近怎麼樣? –

回答

1

關於TBB中我唯一能想到的唯一事情就是可以爲任務分配一個優先級。但這與線程優先級不同。 TBB任務的優先級只會決定任務將從就緒池中選擇,但正如你所說 - 一旦任務運行,它預計將努力工作。使用它來解決您提到的問題的方法是將您的IO工作分解爲段,然後將它們作爲一系列(從屬)低優先級任務提交到工作池中。但我不認爲這會導致你真正的問題...

你提到的GUI線程是TBB模式文件中的一種模式,它說明如何卸載一個任務,然後等待回調來表示它已完成。它與異步並不完全不同。我不認爲這也解決了你的問題。

我認爲這裏最好的方法就是創建一個OS級別的線程。這是Linux上的線程或Windows上的Windows線程。然後你想調用它:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686277(v=vs.85).aspx ...如果你碰巧在C++ 11中,你可以使用std :: thread來創建線程,然後調用thread :: native_handle來獲得句柄調用Windows API來設置優先級。

2

任何I/O阻塞活動都很難通過任務建模 - 因爲任務只能運行到完成,而不是任務的目的。你不會找到任何TBB基於任務的方法來避免這種情況。既然你想要的是一個線程,並且你希望它與你已有的其他TBB代碼或多或少地一起工作,只需使用TBB's native thread class即可解決問題,就像使用任何其他線程API一樣。您無需在此TBB管理的線程上設置優先級或其他任何內容,因爲它會進入阻塞呼叫,然後在資源可用之前不會佔用更多時間。