Partager via


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