內容
本文件說明並行運行時間中內容的角色。 附加至排程器的線程稱為 執行內容,或只是 內容。 並行 ::wait 函式和並行::Context 類別 可讓您控制內容的行為。 使用函 wait
式來暫停目前的內容指定時間。 Context
當您需要對內容區塊、解除封鎖和產生,或想要過度訂閱目前內容時,請使用 類別。
提示
並行執行階段會提供預設排程器,因此您不需要在應用程式中建立排程器。 由於工作排程器可協助您微調應用程式的效能,因此如果您不熟悉並行運行時間,建議您從平行模式連結庫 (PPL) 或異步代理程序連結庫開始。
wait 函式
concurrency ::wait 函式會合作產生目前內容執行指定的毫秒數。 運行時間會使用產生時間來執行其他工作。 經過指定的時間之後,運行時間會重新排程內容以供執行。 因此,函 wait
式可能會暫停目前內容的時間比提供給 milliseconds
參數的值還長。
針對 參數傳遞 0 (零) milliseconds
會導致運行時間暫停目前的內容,直到所有其他使用中內容都有機會執行工作為止。 這可讓您將工作產生給所有其他使用中工作。
範例
如需使用 函 wait
式來產生目前內容的範例,因此允許其他內容執行,請參閱 如何:使用排程群組影響執行順序。
Context 類別
concurrency::Context 類別 提供執行內容的程式設計抽象概念,並提供兩個重要功能:合作封鎖、解除封鎖及產生目前內容,以及過度訂閱目前內容的能力。
合作封鎖
類別 Context
可讓您封鎖或產生目前的執行內容。 當目前內容無法繼續時,封鎖或產生很有用,因為資源無法使用。
並行 ::Context::Block 方法會封鎖目前的內容。 封鎖的內容會產生其處理資源,讓運行時間可以執行其他工作。 並行 ::Context::Unblock 方法會解除封鎖的內容。 Context::Unblock
方法必須從與呼叫的不同內容呼叫Context::Block
。 如果內容嘗試解除封鎖本身,運行時間會 擲回並行::context_self_unblock 。
若要合作封鎖和解除封鎖內容,您通常會呼叫 concurrency::Context::CurrentContext 來擷取與目前線程相關聯的對象指標 Context
,並儲存結果。 接著,您可以呼叫 Context::Block
方法來封鎖目前的內容。 稍後,從個別內容呼叫 Context::Unblock
以解除封鎖封鎖的內容。
您必須比對 和 Context::Unblock
的每個呼叫Context::Block
組。 當 或 Context::Unblock
方法連續呼叫時,運行時間會擲回並行::context_unblock_unbalancedContext::Block
,而不需要對另一個方法的相符呼叫。 不過,您不需要在呼叫 之前呼叫 Context::Block
Context::Unblock
。 例如,如果在另一個內容呼叫Context::Unblock
Context::Block
相同內容之前呼叫某個內容,該內容會保持解除封鎖。
並行 ::Context::Yield 方法會產生執行,讓運行時間可以執行其他工作,然後重新排程內容以供執行。 當您呼叫 Context::Block
方法時,運行時間不會重新排程內容。
範例
如需使用 Context::Block
、 Context::Unblock
和 Context::Yield
方法來實作合作號誌類別的範例,請參閱 如何:使用內容類別實作合作號誌。
過度訂閱
預設排程器會建立與可用硬體線程相同的線程數目。 您可以使用 超額訂閱 ,為指定的硬體線程建立其他線程。
對於計算密集型作業,超額訂閱通常不會調整,因為它會帶來額外的額外負荷。 不過,對於有大量延遲的工作,例如,從磁碟或從網路連線讀取數據,過度訂閱可以改善某些應用程式的整體效率。
注意
只從並行執行階段所建立的執行緒啟用過度訂閱。 從運行時間未建立的線程呼叫過度訂閱時,不會有任何作用(包括主線程)。
若要在目前內容中啟用過度訂閱,請呼叫 concurrency::Context::Oversubscribe 方法,並將 _BeginOversubscription
參數設定為 true
。 當您在並行運行時間所建立的線程上啟用超訂閱時,它會導致運行時間建立一個額外的線程。 要求超額訂閱完成的所有工作之後,請呼叫 Context::Oversubscribe
,並將 _BeginOversubscription
參數設定為 false
。
您可以從目前內容多次啟用超額訂閱,但必須停用啟用該訂閱的次數相同。 過度訂閱也可以巢狀化;也就是說,由另一個使用 oversubscription 的工作所建立的工作也可以過度訂閱其內容。 不過,如果巢狀工作及其父系都屬於相同的內容,則只有最外層的呼叫 Context::Oversubscribe
會導致建立額外的線程。
範例
如需使用超額訂閱來抵消從網路連線讀取數據所造成的延遲的範例,請參閱 如何:使用過度訂閱來位移延遲。