Utilisation du synchronisateur à écriture exclusive et lecture multiple

De RAD Studio
Aller à : navigation, rechercher

Remonter à Eviter les accès simultanés


Lorsque vous utilisez des sections critiques pour protéger la mémoire globale, seul un thread peut utiliser la mémoire à un moment donné. Cette protection peut être exagérée, notamment si un objet ou une variable doit être souvent lu mais dans lequel vous écrivez très rarement. Il n'y a aucun danger à ce que plusieurs threads lisent la même mémoire simultanément, pourvu qu'aucun thread n'y écrit.

Lorsqu'une mémoire globale est souvent lue, mais dans laquelle les threads n'écrivent qu'occasionnellement, vous pouvez la protéger à l'aide de System.SysUtils.TMultiReadExclusiveWriteSynchronizer. Cet objet agit comme une section critique mais permet à plusieurs threads de lire la mémoire qu'il protège à condition qu'aucun thread n'y écrive. Les threads doivent disposer d'un accès exclusif en écriture à la mémoire protégée par TMultiReadExclusiveWriteSynchronizer.

Pour utiliser un synchronisateur à écriture exclusive et à lecture multiple, créez une instance globale de TMultiReadExclusiveWriteSynchronizer associée à la mémoire globale que vous souhaitez protéger. Chaque thread qui lit cette mémoire doit au préalable appeler la méthode BeginRead. BeginRead évite qu'un autre thread n'écrive simultanément dans la mémoire. Lorsqu'un thread a fini de lire la mémoire protégée, il appelle la méthode EndRead. Tout thread qui écrit dans la mémoire protégée doit au préalable appeler BeginWrite. BeginWrite évite qu'un autre thread ne lise ou n'écrive simultanément dans la mémoire. Lorsqu'un thread a fini d'écrire dans la mémoire protégée, il appelle la méthode EndWrite, de sorte que les threads en attente puissent commencer à lire la mémoire.

Avertissement :  Comme les sections critiques, le synchronisateur à écriture exclusive et à lecture multiple ne fonctionne que si chaque thread l'utilise pour accéder à la mémoire globale associée. Les threads qui ignorent le synchronisateur et accèdent à la mémoire globale sans appeler BeginRead ou BeginWrite génèrent des problèmes d'accès simultané.

Voir aussi