Structures de données de synchronisation
Le runtime d'accès concurrentiel fournit plusieurs structures de données qui vous permettent de synchroniser l'accès aux données partagées de plusieurs threads.Ces structures de données sont utiles lorsque vous avez des données partagées que vous modifiez rarement.Un objet de synchronisation, par exemple une section critique, fait en sorte que d'autres threads attendent que la ressource partagée soit disponible.Par conséquent, si vous utilisez un tel objet pour synchroniser l'accès à des données qui sont utilisées fréquemment, vous pouvez perdre l'extensibilité dans votre application.Le Bibliothèque de modèles parallèles fournit la concurrency::combinable (classe), qui vous permet de partager une ressource parmi plusieurs threads ou des tâches sans la nécessité pour la synchronisation.Pour plus d'informations sur la classe combinable, consultez Conteneurs et objets parallèles.
Sections
Cette rubrique décrit les types de blocs de messages asynchrones en détail :
critical_section
reader_writer_lock
scoped_lock et scoped_lock_read
event
critical_section
Le concurrency::critical_section classe représente un objet de l'exclusion mutuelle coopérative donne à d'autres tâches au lieu de leur anticipation.Les sections critiques sont utiles lorsque plusieurs threads requièrent un accès en lecture et en écriture exclusif aux données partagées.
La classe critical_section est non réentrante.Le concurrency::critical_section::lock méthode lève une exception de type concurrency::improper_lock si elle est appelée par le thread qui possède déjà le verrou.
Méthodes et fonctionnalités
Le tableau suivant répertorie les méthodes importantes définies par la classe critical_section.
Méthode |
Description |
---|---|
Acquiert la section critique.Le contexte appelant bloque jusqu'à ce qu'il acquière le verrou. |
|
Essaie d'acquérir la section critique, mais ne bloque pas. |
|
Libère la section critique. |
Top
reader_writer_lock
Le concurrency::reader_writer_lock classe fournit des opérations de thread-safe en lecture/écriture aux données partagées.Utilisez des verrous de lecteur/writer lorsque plusieurs threads requièrent un accès en lecture simultané à une ressource partagée mais écrivent rarement dans cette ressource partagée.Cette classe accorde un accès en écriture à un objet à un seul thread à tout moment.
La classe reader_writer_lock peut offrir de meilleures performances que la classe critical_section car un objet critical_section acquiert l'accès exclusif à une ressource partagée, ce qui empêche l'accès en lecture simultané.
Comme la classe critical_section, la classe reader_writer_lock représente un objet d'exclusion mutuelle coopératif qui cède à d'autres tâches au lieu de les préempter.
Lorsqu'un thread qui doit écrire dans une ressource partagée acquiert un verrou de writer/lecteur, les autres threads qui doivent également accéder à la ressource sont bloqués jusqu'à ce que le writer libère le verrou.La classe reader_writer_lock est un exemple de verrou de préférence d'écriture, à savoir un verrou qui débloque les writers en attente avant de débloquer les lecteurs en attente.
Comme la classe critical_section, la classe reader_writer_lock est non réentrante.Le concurrency::reader_writer_lock::lock et concurrency::reader_writer_lock::lock_read méthodes lèvent une exception de type improper_lock si elles sont appelées par un thread qui possède déjà le verrou.
[!REMARQUE]
Étant donné que la classe reader_writer_lock est non réentrante, il n'est pas possible de mettre à niveau un verrou en lecture seule en un verrou lecture/écriture, ni de rétrograder un verrou lecture/écriture en un verrou en lecture seule.L'exécution de l'une ou l'autre de ces opérations provoque un comportement inattendu.
Méthodes et fonctionnalités
Le tableau suivant répertorie les méthodes importantes définies par la classe reader_writer_lock.
Méthode |
Description |
---|---|
Acquiert l'accès en lecture/écriture au verrou. |
|
Essaie d'acquérir l'accès en lecture/écriture au verrou, mais ne bloque pas. |
|
Acquiert l'accès en lecture seule au verrou. |
|
Essaie d'acquérir l'accès en lecture seule au verrou, mais ne bloque pas. |
|
Libère le verrou. |
Top
scoped_lock et scoped_lock_read
Les classes reader_writer_lock et critical_section fournissent des classes d'assistance imbriquées qui simplifient la façon dont vous utilisez les objets d'exclusion mutuelle.Ces classes d'assistance portent le nom de verrous à portée limitée.
Le critical_section classe contient la concurrency::critical_section::scoped_lock classe.Le constructeur acquiert l'accès à l'objet critical_section fourni ; le destructeur libère l'accès à cet objet.Le reader_writer_lock classe contient la concurrency::reader_writer_lock::scoped_lock (classe), qui ressemble à critical_section::scoped_lock, sauf qu'il gère les accès en écriture à le reader_writer_lock objet.Le reader_writer_lock classe contient également le concurrency::reader_writer_lock::scoped_lock_read classe.Cette classe gère l'accès en lecture à l'objet reader_writer_lock fourni.
Les verrous à portée limitée procurent plusieurs avantages lorsque vous travaillez manuellement avec des objets critical_section et reader_writer_lock.En général, vous allouez un verrou à portée limitée sur la pile.Un verrou à portée limitée libère automatiquement l'accès à son objet d'exclusion mutuelle lorsqu'il est détruit ; par conséquent, vous ne déverrouillez pas l'objet sous-jacent manuellement.Ceci est utile lorsqu'une fonction contient plusieurs instructions return.Les verrous à portée limitée peuvent également vous aider à écrire du code sécurisé du point de vue des exceptions.Lorsqu'une instruction throw provoque le déroulement de la pile, le destructeur de tout verrou à portée limitée actif est appelé. Par conséquent, l'objet d'exclusion mutuelle est toujours libéré correctement.
[!REMARQUE]
Lorsque vous utilisez les classes critical_section::scoped_lock, reader_writer_lock::scoped_lock et reader_writer_lock::scoped_lock_read, ne libérez pas manuellement l'accès à l'objet d'exclusion mutuelle sous-jacent.Cela peut mettre le runtime dans un état non valide.
event
Le concurrency::event classe représente un objet de synchronisation dont l'état peut être signalé ou non signalé.Contrairement aux objets de synchronisation, tels que les sections critiques, dont l'objectif est de protéger l'accès aux données partagées, les événements synchronisent le flux d'exécution.
La classe event est utile lorsqu'une tâche a terminé du travail pour une autre tâche.Par exemple, une tâche peut signaler à une autre tâche qu'elle a lu des données à partir d'une connexion réseau ou d'un fichier.
Méthodes et fonctionnalités
Le tableau suivant répertorie plusieurs des méthodes importantes définies par la classe event.
Méthode |
Description |
---|---|
Attend que l'événement soit signalé. |
|
Place l'événement à l'état signalé. |
|
Place l'événement à l'état non signalé. |
|
Attend que plusieurs événements soient signalés. |
Exemple
Pour obtenir un exemple qui illustre l'utilisation de la classe event, consultez Comparaison de structures de données de synchronisation avec l'API Windows.
Top
Rubriques connexes
Comparaison de structures de données de synchronisation avec l'API Windows
Compare le comportement des structures de données de synchronisation à celles fournies par l'API Windows.Concurrency Runtime
Décrit le runtime d'accès concurrentiel, qui simplifie la programmation parallèle et contient des liens vers des rubriques connexes.