Multithreading : quand utiliser les classes de synchronisation
Les classes multithread fournies avec MFC se répartissent en deux catégories : les objets de synchronisation (CSyncObject, CSemaphore, CMutex, CCriticalSection et CEvent) et les objets d'accès de synchronisation (CMultiLock et CSingleLock).
Les classes de synchronisation sont utilisées quand l'accès à une ressource doit être contrôlé pour assurer l'intégrité de la ressource.Les classes d'accès de synchronisation permettent d'obtenir l'accès à ces ressources contrôlées.Cette rubrique indique quand utiliser chaque classe.
Pour déterminer la classe de synchronisation à utiliser, posez-vous les questions suivantes :
Faut-il que l'application attende qu'un événement se produise avant d'accéder à la ressource (par exemple, il faut d'abord recevoir les données d'un port de communication avant de pouvoir les écrire dans un fichier) ?
Si oui, utilisez CEvent.
Au sein d'une application, plusieurs threads peuvent-ils accéder à cette ressource en même temps (par exemple, votre application autorise jusqu'à cinq fenêtres avec des vues sur le même document ) ?
Si oui, utilisez CSemaphore.
Cette ressource peut-elle être utilisée par plusieurs applications (par exemple, la ressource se trouve dans une DLL) ?
Si oui, utilisez CMutex.
Sinon, utilisez CCriticalSection.
CSyncObject n'est jamais utilisée directement.C'est la classe de base des quatre autres classes de synchronisation.
Exemple 1 : utilisation de trois classes de synchronisation
À titre d'exemple, choisissez une application qui gère une liste liée de comptes.Cette application permet d'examiner jusqu'à trois comptes dans des fenêtres séparées, mais une seule peut être mise à jour à la fois.Lorsqu'un compte est mis à jour, les données mises à jour sont envoyées via le réseau à une archive de données.
Cet exemple d'application utilise les trois types de classes de synchronisation.Dans la mesure où elle permet d'examiner jusqu'à trois comptes à la fois, elle utilise CSemaphore pour limiter l'accès à trois objets de vue.En cas de tentative d'affichage d'un quatrième compte, l'application attend que l'une des trois premières fenêtres se ferme ou elle échoue.Lorsqu'un compte est mis à jour, l'application utilise CCriticalSectionpour s'assurer qu'un seul compte est mis à jour à la fois.Une fois la mise à jour effectuée, elle prévient CEvent, qui libère un thread qui attend que l'événement soit signalé.Ce thread envoie les nouvelles données à l'archive de données.
Exemple 2 : utilisation des classes d'accès de synchronisation
Il est encore plus simple de choisir la classe d'accès de synchronisation à utiliser.Si votre application est concernée par l'accès à une seule ressource contrôlée, utilisez CSingleLock.Si elle a besoin d'accéder à une ressource contrôlée parmi plusieurs, utilisez CMultiLock.Dans l'exemple 1, CSingleLock aurait été utilisée car dans chaque cas où une seule ressource était nécessaire à un moment donné.
Pour plus d'informations sur l'utilisation des classes de synchronisation, consultez Multithreading : comment utiliser les classes de synchronisation.Pour plus d'informations sur la synchronisation, consultez Synchronization dans le Kit de développement logiciel Windows.Pour plus d'informations sur la prise en charge du multithreading dans MFC, consultez Multithreading à l'aide de C++ et de MFC.