Structures de données pour la programmation parallèleData Structures for Parallel Programming

La version 4 de .NET Framework introduit de nouveaux types très utiles pour la programmation parallèle, notamment un ensemble de classes de collections simultanées, des primitives de synchronisation légères et des types pour l’initialisation tardive.The .NET Framework version 4 introduces several new types that are useful in parallel programming, including a set of concurrent collection classes, lightweight synchronization primitives, and types for lazy initialization. Vous pouvez utiliser ces types avec n’importe quel code d’application multithread, y compris la bibliothèque parallèle de tâches et PLINQ.You can use these types with any multithreaded application code, including the Task Parallel Library and PLINQ.

Classes de collections simultanéesConcurrent Collection Classes

Les classes de collections de l’espace de noms System.Collections.Concurrent fournissent des opérations d’ajout et de suppression thread-safe qui évitent autant que possible les verrous et, là où ils se révèlent nécessaires, utilisent un verrouillage de granularité fine.The collection classes in the System.Collections.Concurrent namespace provide thread-safe add and remove operations that avoid locks wherever possible and use fine-grained locking where locks are necessary. Avec une classe de collections simultanées, contrairement aux collections introduites dans les versions 1.0 et 2.0 de .NET Framework, il n’est pas nécessaire que le code utilisateur prenne des verrous pour accéder aux éléments.Unlike collections that were introduced in the .NET Framework versions 1.0 and 2.0, a concurrent collection class does not require user code to take any locks when it accesses items. Les classes de collections simultanées peuvent améliorer considérablement les performances des types comme System.Collections.ArrayList et System.Collections.Generic.List<T> (avec verrouillage implémenté par l’utilisateur) dans le cas où plusieurs threads ajoutent et suppriment des éléments d’une collection.The concurrent collection classes can significantly improve performance over types such as System.Collections.ArrayList and System.Collections.Generic.List<T> (with user-implemented locking) in scenarios where multiple threads add and remove items from a collection.

Le tableau suivant liste les classes de collections simultanées :The following table lists the new concurrent collection classes:

TypeType DescriptionDescription
System.Collections.Concurrent.BlockingCollection<T> Fournit des fonctions bloquantes et englobantes pour les collections thread-safe qui implémentent System.Collections.Concurrent.IProducerConsumerCollection<T>.Provides blocking and bounding capabilities for thread-safe collections that implement System.Collections.Concurrent.IProducerConsumerCollection<T>. Les threads producteurs se bloquent si aucun emplacement n’est disponible ou que la collection est pleine.Producer threads block if no slots are available or if the collection is full. Les threads consommateurs se bloquent si la collection est vide.Consumer threads block if the collection is empty. Ce type prend également en charge l’accès non bloquant par les producteurs et les consommateurs.This type also supports non-blocking access by consumers and producers. BlockingCollection<T> peut être utilisé comme classe de base ou comme magasin de stockage pour assurer le blocage et la liaison des classes de collection qui prennent en charge IEnumerable<T>.BlockingCollection<T> can be used as a base class or backing store to provide blocking and bounding for any collection class that supports IEnumerable<T>.
System.Collections.Concurrent.ConcurrentBag<T> Implémentation de conteneur thread-safe qui effectue des opérations Add et Get évolutives.A thread-safe bag implementation that provides scalable add and get operations.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> Type dictionnaire simultané et évolutif.A concurrent and scalable dictionary type.
System.Collections.Concurrent.ConcurrentQueue<T> File d’attente FIFO simultanée et évolutive.A concurrent and scalable FIFO queue.
System.Collections.Concurrent.ConcurrentStack<T> Pile LIFO simultanée et évolutive.A concurrent and scalable LIFO stack.

Pour plus d’informations, consultez Collections thread-safe.For more information, see Thread-Safe Collections.

Primitives de synchronisationSynchronization Primitives

Les nouvelles primitives de synchronisation de l’espace de noms System.Threading affinent la concurrence et améliorent les performances en évitant les coûteux mécanismes de verrouillage du code multithread hérité.The new synchronization primitives in the System.Threading namespace enable fine-grained concurrency and faster performance by avoiding expensive locking mechanisms found in legacy multithreading code. Certains des nouveaux types, par exemple, System.Threading.Barrier et System.Threading.CountdownEvent, ont pas d’équivalents dans les versions antérieures de .NET Framework.Some of the new types, such as System.Threading.Barrier and System.Threading.CountdownEvent have no counterparts in earlier releases of the .NET Framework.

Le tableau suivant liste les nouveaux types de synchronisation :The following table lists the new synchronization types:

TypeType DescriptionDescription
System.Threading.Barrier Permet à plusieurs threads de fonctionner en parallèle sur un algorithme en fournissant un point auquel chaque tâche peut signaler son arrivée, puis se bloquer jusqu'à ce qu’une partie ou la totalité des tâches soient arrivées.Enables multiple threads to work on an algorithm in parallel by providing a point at which each task can signal its arrival and then block until some or all tasks have arrived. Pour plus d’informations, voir Cloisonnement.For more information, see Barrier.
System.Threading.CountdownEvent Simplifie les scénarios de duplication et de jointure en fournissant un mécanisme facile de réunion.Simplifies fork and join scenarios by providing an easy rendezvous mechanism. Pour plus d'informations, consultez la page CountdownEvent.For more information, see CountdownEvent.
System.Threading.ManualResetEventSlim Primitive de synchronisation similaire à System.Threading.ManualResetEvent.A synchronization primitive similar to System.Threading.ManualResetEvent. ManualResetEventSlim est léger mais n’est utilisable que pour la communication intraprocessus.ManualResetEventSlim is lighter-weight but can only be used for intra-process communication.
System.Threading.SemaphoreSlim Primitive de synchronisation qui limite le nombre de threads pouvant accéder simultanément à une ressource ou à un pool de ressources.A synchronization primitive that limits the number of threads that can concurrently access a resource or a pool of resources. Pour plus d’informations, consultez la page Semaphore et SemaphoreSlim.For more information, see Semaphore and SemaphoreSlim.
System.Threading.SpinLock Primitive de verrou mutex obligeant le thread qui essaie d’acquérir le verrou à attendre dans une boucle ou à rester en attente active pendant un certain temps avant de transmettre son quantum.A mutual exclusion lock primitive that causes the thread that is trying to acquire the lock to wait in a loop, or spin, for a period of time before yielding its quantum. Dans les scénarios où l’attente du verrou est censée être courte, SpinLock offre de meilleures performances que les autres types de verrouillage.In scenarios where the wait for the lock is expected to be short, SpinLock offers better performance than other forms of locking. Pour plus d'informations, consultez la page SpinLock.For more information, see SpinLock.
System.Threading.SpinWait Type petit et léger qui restera en attente active pendant un certain temps et mettra le thread dans un état d’attente si le nombre est dépassé.A small, lightweight type that will spin for a specified time and eventually put the thread into a wait state if the spin count is exceeded. Pour plus d'informations, consultez la page SpinWait.For more information, see SpinWait.

Pour plus d'informations, consultez les pages suivantes :For more information, see:

Classes d’initialisation tardiveLazy Initialization Classes

Avec l’initialisation tardive, la mémoire d’un objet n’est pas allouée tant qu’elle n’est pas nécessaire.With lazy initialization, the memory for an object is not allocated until it is needed. L’initialisation tardive peut améliorer les performances en répartissant uniformément les allocations d’objets sur toute la durée de vie d’un programme.Lazy initialization can improve performance by spreading object allocations evenly across the lifetime of a program. Vous pouvez l’activer sur n’importe quel type personnalisé en incluant le type Lazy<T> dans un wrapper.You can enable lazy initialization for any custom type by wrapping the type Lazy<T>.

Le tableau suivant liste les nouveaux types d’initialisation tardive :The following table lists the lazy initialization types:

TypeType DescriptionDescription
System.Lazy<T> Assure une initialisation tardive légère et thread-safe.Provides lightweight, thread-safe lazy-initialization.
System.Threading.ThreadLocal<T> Fournit une valeur initialisée tardivement thread par thread, chacun appelant de façon tardive la fonction d’initialisation.Provides a lazily-initialized value on a per-thread basis, with each thread lazily-invoking the initialization function.
System.Threading.LazyInitializer Fournit des méthodes statiques qui évitent d’avoir à allouer une instance dédiée d’initialisation tardive.Provides static methods that avoid the need to allocate a dedicated, lazy-initialization instance. Utilise plutôt des références pour vérifier que les cibles ont été initialisées lorsqu’elles sont consultées.Instead, they use references to ensure targets have been initialized as they are accessed.

Pour plus d’informations, consultez Initialisation tardive.For more information, see Lazy Initialization.

Agréger des exceptionsAggregate Exceptions

Le type System.AggregateException permet de capturer plusieurs exceptions levées simultanément sur des threads distincts, et de les retourner au thread de jonction comme une seule exception.The System.AggregateException type can be used to capture multiple exceptions that are thrown concurrently on separate threads, and return them to the joining thread as a single exception. Les types System.Threading.Tasks.Task et System.Threading.Tasks.Parallel ainsi que PLINQ utilisent beaucoup AggregateException pour cela.The System.Threading.Tasks.Task and System.Threading.Tasks.Parallel types and PLINQ use AggregateException extensively for this purpose. Pour plus d’informations, consultez Gestion des exceptions et Comment gérer des exceptions dans une requête PLINQ.For more information, see Exception Handling and How to: Handle Exceptions in a PLINQ Query.

Voir aussiSee also