Instances de planificateur
Ce document décrit le rôle des instances du planificateur dans le runtime d’accès concurrentiel et comment utiliser les classes concurrency ::Scheduler et concurrency ::CurrentScheduler pour créer et gérer des instances de planificateur. Les instances du planificateur sont utiles lorsque vous souhaitez associer des stratégies de planification explicites à des types spécifiques de charges de travail. Par exemple, vous pouvez créer une instance du planificateur pour effectuer certaines tâches avec une priorité de thread élevée et utiliser le planificateur par défaut pour effectuer d’autres tâches avec une priorité de thread normale.
Conseil
Le runtime d'accès concurrentiel fournit un planificateur par défaut, et vous n'êtes donc pas obligé d'en créer un dans votre application. Étant donné que le planificateur de tâches vous aide à affiner les performances de vos applications, nous vous recommandons de commencer par la bibliothèque de modèles parallèles (PPL) ou la bibliothèque d’agents asynchrones si vous débutez avec le runtime d’accès concurrentiel.
Sections
Classes Scheduler et CurrentScheduler
Le planificateur de tâches permet aux applications d’utiliser une ou plusieurs instances de planificateur pour planifier le travail. La classe concurrency ::Scheduler représente une instance de planificateur et encapsule les fonctionnalités liées aux tâches de planification.
Un thread attaché à un planificateur est appelé contexte d’exécution, ou simplement contexte. Un planificateur peut être actif sur le contexte actuel à tout moment. Le planificateur actif est également appelé planificateur actuel. Le runtime d’accès concurrentiel utilise la classe concurrency ::CurrentScheduler pour fournir l’accès au planificateur actuel. Le planificateur actuel pour un contexte peut différer du planificateur actuel pour un autre contexte. Le runtime ne fournit pas de représentation au niveau du processus du planificateur actuel.
En règle générale, la CurrentScheduler
classe est utilisée pour accéder au planificateur actuel. La Scheduler
classe est utile lorsque vous devez gérer un planificateur qui n’est pas le planificateur actuel.
Les sections suivantes décrivent comment créer et gérer une instance de planificateur. Pour obtenir un exemple complet illustrant ces tâches, consultez Guide pratique pour gérer une instance de planificateur.
[Haut]
Création d’une instance scheduler
Il existe trois façons de créer un Scheduler
objet :
Si aucun planificateur n’existe, le runtime crée un planificateur par défaut lorsque vous utilisez la fonctionnalité d’exécution, par exemple un algorithme parallèle, pour effectuer le travail. Le planificateur par défaut devient le planificateur actuel pour le contexte qui lance le travail parallèle.
La méthode concurrency ::CurrentScheduler ::Create crée un objet qui utilise une
Scheduler
stratégie spécifique et associe ce planificateur au contexte actuel.La méthode concurrency ::Scheduler ::Create crée un objet qui utilise une
Scheduler
stratégie spécifique, mais ne l’associe pas au contexte actuel.
Autoriser le runtime à créer un planificateur par défaut permet à toutes les tâches simultanées de partager le même planificateur. En règle générale, les fonctionnalités fournies par la bibliothèque de modèles parallèles (PPL) ou la bibliothèque d’agents asynchrones sont utilisées pour effectuer un travail parallèle. Par conséquent, vous n’avez pas besoin de travailler directement avec le planificateur pour contrôler sa stratégie ou sa durée de vie. Lorsque vous utilisez la bibliothèque PPL ou Agents, le runtime crée le planificateur par défaut s’il n’existe pas et le rend le planificateur actuel pour chaque contexte. Lorsque vous créez un planificateur et que vous le définissez comme planificateur actuel, le runtime utilise ce planificateur pour planifier des tâches. Créez des instances de planificateur supplémentaires uniquement lorsque vous avez besoin d’une stratégie de planification spécifique. Pour plus d’informations sur les stratégies associées à un planificateur, consultez Stratégies du planificateur.
[Haut]
Gestion de la durée de vie d’une instance scheduler
Le runtime utilise un mécanisme de comptage de références pour contrôler la durée de vie des Scheduler
objets.
Lorsque vous utilisez la CurrentScheduler::Create
méthode ou la Scheduler::Create
méthode pour créer un Scheduler
objet, le runtime définit le nombre de références initial de ce planificateur sur un. Le runtime incrémente le nombre de références lorsque vous appelez la méthode concurrency ::Scheduler ::Attach . La Scheduler::Attach
méthode associe l’objet Scheduler
au contexte actuel. Cela en fait le planificateur actuel. Lorsque vous appelez la CurrentScheduler::Create
méthode, le runtime crée un Scheduler
objet et l’attache au contexte actuel (et définit le nombre de références sur un). Vous pouvez également utiliser la méthode concurrency ::Scheduler ::Reference pour incrémenter le nombre de références d’un Scheduler
objet.
Le runtime décrémente le nombre de références lorsque vous appelez la méthode concurrency ::CurrentScheduler ::D etach pour détacher le planificateur actuel ou appeler la méthode concurrency ::Scheduler ::Release . Lorsque le nombre de références atteint zéro, le runtime détruit l’objet Scheduler
une fois toutes les tâches planifiées terminées. Une tâche en cours d’exécution est autorisée à incrémenter le nombre de références du planificateur actuel. Par conséquent, si le nombre de références atteint zéro et qu’une tâche incrémente le nombre de références, le runtime ne détruit pas l’objet Scheduler
tant que le nombre de références n’atteint plus zéro et que toutes les tâches se terminent.
Le runtime gère une pile interne d’objets Scheduler
pour chaque contexte. Lorsque vous appelez le ou CurrentScheduler::Create
la Scheduler::Attach
méthode, le runtime envoie (push) cet Scheduler
objet sur la pile pour le contexte actuel. Cela en fait le planificateur actuel. Lorsque vous appelez CurrentScheduler::Detach
, le runtime affiche le planificateur actuel à partir de la pile pour le contexte actuel et définit le précédent comme planificateur actuel.
Le runtime fournit plusieurs façons de gérer la durée de vie d’une instance de planificateur. Le tableau suivant montre la méthode appropriée qui libère ou détache le planificateur du contexte actuel pour chaque méthode qui crée ou attache un planificateur au contexte actuel.
Créer ou attacher une méthode | Méthode release ou détacher |
---|---|
CurrentScheduler::Create |
CurrentScheduler::Detach |
Scheduler::Create |
Scheduler::Release |
Scheduler::Attach |
CurrentScheduler::Detach |
Scheduler::Reference |
Scheduler::Release |
L’appel de la version inappropriée ou de la méthode de détachement produit un comportement non spécifié dans le runtime.
Lorsque vous utilisez des fonctionnalités, par exemple, la bibliothèque PPL, qui entraîne la création du planificateur par défaut pour vous, ne relâchez pas ou détachez ce planificateur. Le runtime gère la durée de vie de n’importe quel planificateur qu’il crée.
Étant donné que le runtime ne détruit pas un Scheduler
objet avant la fin de toutes les tâches, vous pouvez utiliser la méthode concurrency ::Scheduler ::RegisterShutdownEvent ou la méthode concurrency ::CurrentScheduler ::RegisterShutdownEvent pour recevoir une notification lorsqu’un Scheduler
objet est détruit. Cela est utile lorsque vous devez attendre que chaque tâche planifiée par un Scheduler
objet se termine.
[Haut]
Méthodes et fonctionnalités
Cette section récapitule les méthodes importantes des classes et Scheduler
des CurrentScheduler
classes.
Considérez la CurrentScheduler
classe comme un assistance pour la création d’un planificateur à utiliser sur le contexte actuel. La Scheduler
classe vous permet de contrôler un planificateur qui appartient à un autre contexte.
Le tableau suivant présente les méthodes importantes définies par la CurrentScheduler
classe.
Méthode | Description |
---|---|
Créer | Crée un Scheduler objet qui utilise la stratégie spécifiée et l’associe au contexte actuel. |
Get | Récupère un pointeur vers l’objet Scheduler associé au contexte actuel. Cette méthode n’incrémente pas le nombre de références de l’objet Scheduler . |
Détacher | Détache le planificateur actuel du contexte actuel et définit le planificateur précédent comme planificateur actuel. |
RegisterShutdownEvent | Enregistre un événement que le runtime définit lorsque le planificateur actuel est détruit. |
CreateScheduleGroup | Crée un objet concurrency ::ScheduleGroup dans le planificateur actuel. |
ScheduleTask | Ajoute une tâche légère à la file d’attente de planification du planificateur actuel. |
GetPolicy | Récupère une copie de la stratégie associée au planificateur actuel. |
Le tableau suivant présente les méthodes importantes définies par la Scheduler
classe.
Méthode | Description |
---|---|
Créer | Crée un Scheduler objet qui utilise la stratégie spécifiée. |
Attacher | Associe l’objet Scheduler au contexte actuel. |
Référence | Incrémente le compteur de référence de l’objet Scheduler . |
Version release | Décrémente le compteur de référence de l’objet Scheduler . |
RegisterShutdownEvent | Inscrit un événement que le runtime définit lorsque l’objet Scheduler est détruit. |
CreateScheduleGroup | Crée un objet concurrency ::ScheduleGroup dans l’objet Scheduler . |
ScheduleTask | Planifie une tâche légère à partir de l’objet Scheduler . |
GetPolicy | Récupère une copie de la stratégie associée à l’objet Scheduler . |
SetDefaultSchedulerPolicy | Définit la stratégie du runtime à utiliser lors de la création du planificateur par défaut. |
ResetDefaultSchedulerPolicy | Restaure la stratégie par défaut sur celle qui était active avant l’appel à SetDefaultSchedulerPolicy . Si le planificateur par défaut est créé après cet appel, le runtime utilise les paramètres de stratégie par défaut pour créer le planificateur. |
[Haut]
Exemple
Pour obtenir des exemples de base sur la création et la gestion d’une instance de planificateur, consultez Guide pratique pour gérer une instance de planificateur.
Voir aussi
Planificateur de tâches
Guide pratique pour gérer une instance de planificateur
Stratégies de planificateur
Groupes de planification