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