Partager via


Context, classe

Représente une abstraction pour un contexte d'exécution.

Syntaxe

class Context;

Membres

Constructeurs protégés

Nom Description
~Destructeur de contexte

Méthodes publiques

Nom Description
Blocage Bloque le contexte actuel.
CurrentContext Retourne un pointeur vers le contexte actuel.
GetId Retourne un identificateur pour le contexte unique dans le planificateur auquel appartient le contexte.
GetScheduleGroupId Retourne un identificateur pour le groupe de planification sur lequel le contexte fonctionne actuellement.
GetVirtualProcessorId Retourne un identificateur pour le processeur virtuel sur lequel le contexte s’exécute actuellement.
Id Retourne un identificateur pour le contexte actuel unique dans le planificateur auquel appartient le contexte actuel.
IsCurrentTaskCollectionCanceling Retourne une indication indiquant si la collection de tâches en cours d’exécution sur le contexte actuel se trouve au milieu d’une annulation active (ou sera prochainement).
IsSynchronouslyBlocked Détermine si le contexte est bloqué de façon synchrone ou non. Un contexte est considéré comme étant bloqué de manière synchrone s’il a effectué explicitement une action qui a entraîné le blocage.
Sursubscribe Injecte un processeur virtuel supplémentaire dans un planificateur pendant la durée d’un bloc de code lorsqu’il est appelé sur un contexte s’exécutant sur l’un des processeurs virtuels de ce planificateur.
ScheduleGroupId Retourne un identificateur pour le groupe de planification sur lequel le contexte actuel fonctionne.
Débloquer Débloque le contexte et l’entraîne à devenir exécutable.
VirtualProcessorId Retourne un identificateur pour le processeur virtuel sur lequel le contexte actuel s’exécute.
Yield Produit l'exécution pour qu'un autre contexte puisse s'exécuter. Si aucun autre contexte n'est disponible pour la production, le planificateur peut produire dans un autre thread du système d'exploitation.

Notes

Le planificateur d’exécution concurrentiel (voir Scheduler) utilise des contextes d’exécution pour exécuter le travail mis en file d’attente par votre application. Un thread Win32 est un exemple de contexte d’exécution sur un système d’exploitation Windows.

À tout moment, le niveau d’accès concurrentiel d’un planificateur est égal au nombre de processeurs virtuels qui lui sont accordés par Resource Manager. Un processeur virtuel est une abstraction pour une ressource de traitement et mappe à un thread matériel sur le système sous-jacent. Un seul contexte de planificateur peut s’exécuter sur un processeur virtuel à un moment donné.

Le planificateur est de nature coopérative et un contexte en cours d’exécution peut produire son processeur virtuel à un autre contexte à tout moment s’il souhaite entrer un état d’attente. Lorsque son attente est satisfaite, il ne peut pas reprendre tant qu’un processeur virtuel disponible à partir du planificateur commence à l’exécuter.

Hiérarchie d'héritage

Context

Spécifications

En-tête : concrt.h

Espace de noms : concurrency

Blocage

Bloque le contexte actuel.

static void __cdecl Block();

Notes

Cette méthode entraîne la création du planificateur par défaut du processus et/ou son attachement au contexte d'appel s'il n'existe aucun planificateur actuellement associé au contexte d'appel.

Si le contexte appelant s’exécute sur un processeur virtuel, le processeur virtuel trouve un autre contexte exécutable à exécuter ou peut en créer un.

Une fois la Block méthode appelée ou appelée, vous devez l’associer à un appel à la méthode Unblock à partir d’un autre contexte d’exécution pour qu’elle s’exécute à nouveau. N’oubliez pas qu’il existe une période critique entre le point où votre code publie son contexte pour qu’un autre thread puisse appeler la Unblock méthode et le point où l’appel de méthode réel est Block effectué. Pendant cette période, vous ne devez pas appeler une méthode qui peut à son tour bloquer et débloquer pour ses propres raisons (par exemple, acquérir un verrou). Les appels à la méthode et Unblock à la Block méthode ne suivent pas la raison du blocage et du déblocage. Un seul objet doit avoir la propriété d’une Block- Unblock paire.

Cette méthode peut lever diverses exceptions, notamment scheduler_resource_allocation_error.

~Contexte

virtual ~Context();

CurrentContext

Retourne un pointeur vers le contexte actuel.

static Context* __cdecl CurrentContext();

Valeur de retour

Pointeur vers le contexte actuel.

Notes

Cette méthode entraîne la création du planificateur par défaut du processus et/ou son attachement au contexte d'appel s'il n'existe aucun planificateur actuellement associé au contexte d'appel.

GetId

Retourne un identificateur pour le contexte unique dans le planificateur auquel appartient le contexte.

virtual unsigned int GetId() const = 0;

Valeur de retour

Identificateur du contexte unique dans le planificateur auquel appartient le contexte.

GetScheduleGroupId

Retourne un identificateur pour le groupe de planification sur lequel le contexte fonctionne actuellement.

virtual unsigned int GetScheduleGroupId() const = 0;

Valeur de retour

Identificateur du groupe de planification sur lequel le contexte fonctionne actuellement.

Notes

La valeur de retour de cette méthode est un échantillonnage instantané du groupe de planification sur lequel le contexte s’exécute. Si cette méthode est appelée sur un contexte autre que le contexte actuel, la valeur peut être obsolète au moment où elle est retournée et ne peut pas être utilisée. En règle générale, cette méthode est utilisée uniquement à des fins de débogage ou de suivi.

GetVirtualProcessorId

Retourne un identificateur pour le processeur virtuel sur lequel le contexte s’exécute actuellement.

virtual unsigned int GetVirtualProcessorId() const = 0;

Valeur de retour

Si le contexte est en cours d’exécution sur un processeur virtuel, un identificateur pour le processeur virtuel sur lequel le contexte est en cours d’exécution ; sinon, la valeur -1.

Notes

La valeur de retour de cette méthode est un échantillonnage instantané du processeur virtuel sur lequel le contexte s’exécute. Cette valeur peut être obsolète au moment où elle est retournée et ne peut pas être basée sur. En règle générale, cette méthode est utilisée uniquement à des fins de débogage ou de suivi.

Id

Retourne un identificateur pour le contexte actuel unique dans le planificateur auquel appartient le contexte actuel.

static unsigned int __cdecl Id();

Valeur de retour

Si le contexte actuel est attaché à un planificateur, identificateur du contexte actuel unique dans le planificateur auquel appartient le contexte actuel ; sinon, la valeur -1.

IsCurrentTaskCollectionCanceling

Retourne une indication indiquant si la collection de tâches en cours d’exécution sur le contexte actuel se trouve au milieu d’une annulation active (ou sera prochainement).

static bool __cdecl IsCurrentTaskCollectionCanceling();

Valeur de retour

Si un planificateur est attaché au contexte appelant et qu’un groupe de tâches exécute une tâche inline sur ce contexte, indique si ce groupe de tâches se trouve au milieu d’une annulation active (ou sera prochainement) ; sinon, la valeur false.

IsSynchronouslyBlocked

Détermine si le contexte est bloqué de façon synchrone ou non. Un contexte est considéré comme étant bloqué de manière synchrone s’il a effectué explicitement une action qui a entraîné le blocage.

virtual bool IsSynchronouslyBlocked() const = 0;

Valeur de retour

Indique si le contexte est bloqué de manière synchrone.

Notes

Un contexte est considéré comme étant bloqué de manière synchrone s’il a effectué explicitement une action qui a entraîné le blocage. Sur le planificateur de threads, cela indique un appel direct à la Context::Block méthode ou à un objet de synchronisation qui a été généré à l’aide de la Context::Block méthode.

La valeur de retour de cette méthode est un exemple instantané de blocage synchrone du contexte. Cette valeur peut être obsolète au moment où elle est retournée et ne peut être utilisée que dans des circonstances très spécifiques.

operator delete

Un Context objet est détruit en interne par le runtime. Il ne peut pas être supprimé explicitement.

void operator delete(void* _PObject);

Paramètres

_PObject
Pointeur vers l’objet à supprimer.

Sursubscribe

Injecte un processeur virtuel supplémentaire dans un planificateur pendant la durée d’un bloc de code lorsqu’il est appelé sur un contexte s’exécutant sur l’un des processeurs virtuels de ce planificateur.

static void __cdecl Oversubscribe(bool _BeginOversubscription);

Paramètres

_BeginOversubscription
Si true, indication qu’un processeur virtuel supplémentaire doit être ajouté pendant la durée de la sursubscription. Si false, une indication que la sursubscription doit se terminer et que le processeur virtuel précédemment ajouté doit être supprimé.

ScheduleGroupId

Retourne un identificateur pour le groupe de planification sur lequel le contexte actuel fonctionne.

static unsigned int __cdecl ScheduleGroupId();

Valeur de retour

Si le contexte actuel est attaché à un planificateur et travaille sur un groupe de planification, identificateur du groupe planificateur sur lequel le contexte actuel travaille ; sinon, la valeur -1.

Débloquer

Débloque le contexte et l’entraîne à devenir exécutable.

virtual void Unblock() = 0;

Notes

Il est parfaitement légal pour un appel à la Unblock méthode à venir avant un appel correspondant à la méthode Block . Tant que les appels aux méthodes et Unblock aux Block méthodes sont correctement couplés, le runtime gère correctement la race naturelle de l’ordre. Un Unblock appel qui arrive avant un Block appel annule simplement l’effet de l’appel Block .

Il existe plusieurs exceptions qui peuvent être levées à partir de cette méthode. Si un contexte tente d’appeler la Unblock méthode sur lui-même, une exception context_self_unblock est levée. Si les appels vers Block et Unblock ne sont pas correctement couplés (par exemple, deux appels à Unblock effectuer pour un contexte en cours d’exécution), une exception de context_unblock_unbalanced est levée.

N’oubliez pas qu’il existe une période critique entre le point où votre code publie son contexte pour qu’un autre thread puisse appeler la Unblock méthode et le point où l’appel de méthode réel est Block effectué. Pendant cette période, vous ne devez pas appeler une méthode qui peut à son tour bloquer et débloquer pour ses propres raisons (par exemple, acquérir un verrou). Les appels à la méthode et Unblock à la Block méthode ne suivent pas la raison du blocage et du déblocage. Un seul objet doit avoir la propriété d’une Block paire.Unblock

VirtualProcessorId

Retourne un identificateur pour le processeur virtuel sur lequel le contexte actuel s’exécute.

static unsigned int __cdecl VirtualProcessorId();

Valeur de retour

Si le contexte actuel est attaché à un planificateur, identificateur du processeur virtuel sur lequel le contexte actuel s’exécute ; sinon, la valeur -1.

Notes

La valeur de retour de cette méthode est un échantillonnage instantané du processeur virtuel sur lequel le contexte actuel s’exécute. Cette valeur peut être obsolète au moment où elle est retournée et ne peut pas être basée sur. En règle générale, cette méthode est utilisée uniquement à des fins de débogage ou de suivi.

Yield

Produit l'exécution pour qu'un autre contexte puisse s'exécuter. Si aucun autre contexte n'est disponible pour la production, le planificateur peut produire dans un autre thread du système d'exploitation.

static void __cdecl Yield();

Notes

Cette méthode entraîne la création du planificateur par défaut du processus et/ou son attachement au contexte d'appel s'il n'existe aucun planificateur actuellement associé au contexte d'appel.

YieldExecution

Produit l'exécution pour qu'un autre contexte puisse s'exécuter. Si aucun autre contexte n'est disponible pour la production, le planificateur peut produire dans un autre thread du système d'exploitation.

static void __cdecl YieldExecution();

Notes

Cette méthode entraîne la création du planificateur par défaut du processus et/ou son attachement au contexte d'appel s'il n'existe aucun planificateur actuellement associé au contexte d'appel.

Cette fonction est nouvelle dans Visual Studio 2015 et est identique à la fonction Yield , mais n’est pas en conflit avec la macro Yield dans Windows.h.

Voir aussi

accès concurrentiel Namespace
Scheduler, classe
Planificateur de tâches