Context 類別
代表執行內容的抽象概念。
語法
class Context;
成員
受保護的建構函式
名稱 | 描述 |
---|---|
~Context 解構函式 |
公用方法
名稱 | 描述 |
---|---|
區塊 | 封鎖目前的內容。 |
CurrentContext | 傳回目前內容的指標。 |
GetId | 傳回內容在內容所屬排程器內唯一的標識碼。 |
GetScheduleGroupId | 傳回內容目前正在處理之排程群組的標識碼。 |
GetVirtualProcessorId | 傳回內容目前正在執行之虛擬處理器的標識碼。 |
Id | 傳回目前內容在目前內容所屬排程器內唯一的標識碼。 |
IsCurrentTaskCollectionCanceling | 傳回目前在目前內容上內嵌執行的工作集合是否處於作用中取消狀態(或不久之後)。 |
IsSynchronouslyBlocked | 判斷內容是否同步封鎖。 如果內容明確執行導致封鎖的動作,則會被視為同步封鎖。 |
Oversubscribe | 在該排程器中某個虛擬處理器上執行的內容上叫用時,將額外的虛擬處理器插入排程器中程式代碼區塊的持續時間。 |
ScheduleGroupId | 傳回目前內容所處理之排程群組的標識碼。 |
疏通 | 解除封鎖內容,並導致它變成可執行。 |
VirtualProcessorId | 傳回目前內容執行之虛擬處理器的標識碼。 |
Yield | 會產生執行,以便能夠執行其他內容。 如果沒有其他內容需要產生,排程器即會配合其他作業系統執行緒。 |
備註
並行運行時間排程器 (請參閱 排程器) 會使用執行內容來執行應用程式排入佇列的工作。 Win32 線程是 Windows 作業系統上執行內容的範例。
您可以隨時將排程器的並行層級等於 Resource Manager 授與的虛擬處理器數目。 虛擬處理器是處理資源的抽象概念,並對應至基礎系統上的硬體線程。 只有單一排程器內容可以在指定的時間在虛擬處理器上執行。
排程器在本質上是合作的,如果想要進入等候狀態,則執行內容可以隨時將其虛擬處理器產生至不同的內容。 當排程器中的可用虛擬處理器開始執行之前,當其等候滿足時,就無法繼續執行。
繼承階層架構
Context
需求
標頭: concrt.h
命名空間: concurrency
區塊
封鎖目前的內容。
static void __cdecl Block();
備註
如果呼叫的內容目前沒有任何相關聯的排程器,則這個方法會將處理序的預設排程器建立及/或附加至呼叫的內容。
如果呼叫內容是在虛擬處理器上執行,虛擬處理器會找到另一個可執行的內容來執行,或可能會建立新的內容。
Block
呼叫 方法或將呼叫之後,您必須將它與從另一個執行內容對 Unblock 方法的呼叫配對,才能再次執行。 請注意,程式代碼發佈其內容給另一個線程的點之間有一個重要期間,以便呼叫 Unblock
方法,以及實際方法呼叫的 Block
點。 在這個過程中,您不能呼叫因本身原因而封鎖及解除封鎖的任何方法 (例如,取得鎖定)。 對和 Unblock
方法的Block
呼叫不會追蹤封鎖和解除封鎖的原因。 只有一個對象應該擁有配對 Block
- Unblock
的擁有權。
此方法可以擲回各種例外狀況,包括 scheduler_resource_allocation_error。
~上下文
virtual ~Context();
CurrentContext
傳回目前內容的指標。
static Context* __cdecl CurrentContext();
傳回值
目前內容的指標。
備註
如果呼叫的內容目前沒有任何相關聯的排程器,則這個方法會將處理序的預設排程器建立及/或附加至呼叫的內容。
GetId
傳回內容在內容所屬排程器內唯一的標識碼。
virtual unsigned int GetId() const = 0;
傳回值
內容在內容所屬排程器內唯一的標識碼。
GetScheduleGroupId
傳回內容目前正在處理之排程群組的標識碼。
virtual unsigned int GetScheduleGroupId() const = 0;
傳回值
內容目前正在處理的排程群組標識碼。
備註
這個方法的傳回值是內容的實時取樣排程群組。 如果在非目前內容的其他內容上呼叫這個方法,則值傳回時可能會過期,因而無法依賴。 通常,這個方法僅用於偵錯或追蹤目的。
GetVirtualProcessorId
傳回內容目前正在執行之虛擬處理器的標識碼。
virtual unsigned int GetVirtualProcessorId() const = 0;
傳回值
如果內容目前正在虛擬處理器上執行,則為內容目前正在執行的虛擬處理器標識符;否則為 值 -1
。
備註
這個方法的傳回值是內容執行時虛擬處理器的即時取樣。 這個值傳回時可能會過期,因而無法依賴。 通常,這個方法僅用於偵錯或追蹤目的。
Id
傳回目前內容在目前內容所屬排程器內唯一的標識碼。
static unsigned int __cdecl Id();
傳回值
如果目前內容附加至排程器,則目前內容在目前內容所屬排程器內唯一的標識元;否則為 值 -1
。
IsCurrentTaskCollectionCanceling
傳回目前在目前內容上內嵌執行的工作集合是否處於作用中取消狀態(或不久之後)。
static bool __cdecl IsCurrentTaskCollectionCanceling();
傳回值
如果排程器附加至呼叫內容,而工作組正在該內容上內嵌執行工作,則表示該工作組是否處於作用中取消狀態(或即將執行中):否則為 值 false
。
IsSynchronouslyBlocked
判斷內容是否同步封鎖。 如果內容明確執行導致封鎖的動作,則會被視為同步封鎖。
virtual bool IsSynchronouslyBlocked() const = 0;
傳回值
內容是否同步封鎖。
備註
如果內容明確執行導致封鎖的動作,則會被視為同步封鎖。 在執行緒排程器上,這表示直接呼叫 Context::Block
方法或是使用 Context::Block
方法建置的同步處理物件。
這個方法的傳回值是是否同步封鎖內容的瞬間範例。 這個值在傳回的那一刻可能會過時,而且只能在非常特定的情況下使用。
operator delete
運行 Context
時間會在內部終結 物件。 不可將它明確刪除。
void operator delete(void* _PObject);
參數
_PObject
要刪除之物件的指標。
Oversubscribe
在該排程器中某個虛擬處理器上執行的內容上叫用時,將額外的虛擬處理器插入排程器中程式代碼區塊的持續時間。
static void __cdecl Oversubscribe(bool _BeginOversubscription);
參數
_BeginOversubscription
如果 true
為 ,表示應該在超額訂閱期間新增額外的虛擬處理器。 如果 false
為 ,表示過度訂閱應該結束,而且應該移除先前新增的虛擬處理器。
ScheduleGroupId
傳回目前內容所處理之排程群組的標識碼。
static unsigned int __cdecl ScheduleGroupId();
傳回值
如果目前的內容附加至排程器並處理排程群組,則目前內容正在處理的排程器群組標識符;否則為 值 -1
。
解除封鎖
解除封鎖內容,並導致它變成可執行。
virtual void Unblock() = 0;
備註
呼叫 方法在對 Block 方法的對應呼叫之前,是完全合法的Unblock
。 只要對 和 Unblock
方法的Block
呼叫正確配對,運行時間就會正確處理任一排序的自然競爭。 Unblock
呼叫之前Block
來的呼叫只會否定呼叫的效果Block
。
有數個例外狀況可以從這個方法擲回。 如果內容嘗試自行呼叫 Unblock
方法, 則會擲回context_self_unblock 例外狀況。 如果對 Block
和 Unblock
的呼叫未正確配對(例如,針對目前正在執行的內容進行兩次呼叫 Unblock
), 則會擲回context_unblock_unbalanced 例外狀況。
請注意,程式代碼發佈其內容給另一個線程的點之間有一個重要期間,以便呼叫 Unblock
方法,以及實際方法呼叫的 Block
點。 在這個過程中,您不能呼叫因本身原因而封鎖及解除封鎖的任何方法 (例如,取得鎖定)。 對和 Unblock
方法的Block
呼叫不會追蹤封鎖和解除封鎖的原因。 只有一個 對象應該擁有和 Unblock
配對的Block
擁有權。
VirtualProcessorId
傳回目前內容執行之虛擬處理器的標識碼。
static unsigned int __cdecl VirtualProcessorId();
傳回值
如果目前的內容附加至排程器,則為目前內容執行時之虛擬處理器的標識碼;否則為 值 -1
。
備註
這個方法的傳回值是目前內容執行時虛擬處理器的即時取樣。 這個值傳回時可能會過期,因而無法依賴。 通常,這個方法僅用於偵錯或追蹤目的。
Yield
會產生執行,以便能夠執行其他內容。 如果沒有其他內容需要產生,排程器即會配合其他作業系統執行緒。
static void __cdecl Yield();
備註
如果呼叫的內容目前沒有任何相關聯的排程器,則這個方法會將處理序的預設排程器建立及/或附加至呼叫的內容。
YieldExecution
會產生執行,以便能夠執行其他內容。 如果沒有其他內容需要產生,排程器即會配合其他作業系統執行緒。
static void __cdecl YieldExecution();
備註
如果呼叫的內容目前沒有任何相關聯的排程器,則這個方法會將處理序的預設排程器建立及/或附加至呼叫的內容。
此函式是 Visual Studio 2015 的新功能, 與 Yield 函式相同,但不會與 Windows.h 中的 Yield 巨集衝突。