共用方式為


內容

本檔說明並行執行時間中內容的角色。 附加至排程器的執行緒稱為 執行內容 ,或只是 內容 。 並行 ::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_unbalanced Context::Block ,而不需要對另一個方法的相符呼叫。 不過,您不需要在呼叫 之前呼叫 Context::Block Context::Unblock 。 例如,如果在另一個內容呼叫 Context::Unblock Context::Block 相同內容之前呼叫某個內容,該內容會保持解除封鎖。

並行 ::CoNtext::Yield 方法會產生執行,讓執行時間可以執行其他工作,然後重新排程內容以供執行。 當您呼叫 Context::Block 方法時,執行時間不會重新排程內容。

範例

如需使用 Context::BlockContext::UnblockContext::Yield 方法來實作合作號志類別的範例,請參閱 如何:使用內容類別別實作合作號 志。

過度訂閱

預設排程器會建立與可用硬體執行緒相同的執行緒數目。 您可以使用 超額訂閱 ,為指定的硬體執行緒建立其他執行緒。

對於計算密集型作業,超額訂閱通常不會調整,因為它會帶來額外的額外負荷。 不過,對於有大量延遲的工作,例如,從磁片或從網路連線讀取資料,過度訂閱可以改善某些應用程式的整體效率。

注意

只從並行執行階段所建立的執行緒啟用過度訂閱。 從執行時間未建立的執行緒呼叫過度訂閱時,不會有任何作用(包括主執行緒)。

若要在目前內容中啟用過度訂閱,請呼叫 concurrency::CoNtext::Oversubscribe 方法,並將 _BeginOversubscription 參數設定為 true 。 當您在並行執行時間所建立的執行緒上啟用超訂閱時,它會導致執行時間建立一個額外的執行緒。 要求超額訂閱完成的所有工作之後,請呼叫 Context::Oversubscribe ,並將 _BeginOversubscription 參數設定為 false

您可以從目前內容多次啟用超額訂閱,但必須停用啟用該訂閱的次數相同。 過度訂閱也可以巢狀化;也就是說,由另一個使用 oversubscription 的工作所建立的工作也可以過度訂閱其內容。 不過,如果巢狀工作及其父系都屬於相同的內容,則只有最外層的呼叫 Context::Oversubscribe 會導致建立額外的執行緒。

範例

如需使用超額訂閱來抵消從網路連線讀取資料所造成的延遲的範例,請參閱 如何:使用過度訂閱來位移延遲

另請參閱

工作排程器
如何:使用排程群組來影響執行順序
如何:使用內容類別實作合作式信號
如何:使用過度訂閱使延遲產生位移