Eviter les accès de threads simultanés dans la même mémoire
Remonter à Comment construire des applications multithreads
Utilisez ces techniques de base pour empêcher les autres threads d'accéder à la même mémoire que votre thread :
Pour verrouiller des objets
- Pour les objets tels que les canevas qui possèdent une méthode Lock, appelez la méthode Lock, si nécessaire, pour empêcher d'autres objets d'accéder à cet objet, et appelez Unlock quand le verrouillage n'est plus nécessaire.
- Appelez TThreadList.LockList (Delphi) ou TThreadList::LockList() (C++) pour empêcher des threads d'utiliser l'objet liste TThreadList, et appelez TThreadList.UnlockList quand le verrouillage n'est plus nécessaire.
Remarque : Vous pouvez appeler en toute sécurité TCanvas.Lock et TThreadList.LockList.
Pour utiliser une section critique
- Créez une instance globale de TCriticalSection.
- Appelez la méthode Acquire pour verrouiller les autres threads pendant l'accès à la mémoire globale.
- Appelez la méthode Release pour que les autres threads puissent accéder à la mémoire en appelant Acquire.Le code suivant a une section critique des variables globales, LockXY, qui bloque l'accès aux variables globales X et Y. Tout thread utilisant X ou Y doit encadrer cette utilisation d'appels à la section critique comme ci-dessous
Delphi :
LockXY.Acquire;
try
X := X + 1;
Y := sin(X);
finally
LockXY.Release
end;
C++ :
LockXY->Acquire();
try
{
x++;
y = sin( x );
}
__finally
{
LockXY->Release();
}
Avertissement : Les sections critiques ne peuvent fonctionner que si tous les threads les utilisent pour accéder à la mémoire globale. Sinon, des problèmes d'accès simultané peuvent se produire.
Pour utiliser le synchronisateur à écriture exclusive et lecture multiple
- Créez une instance globale de TMultiReadExclusiveWriteSynchronizer associée à la mémoire globale que vous souhaitez protéger.
- Pour qu'un thread puisse lire la mémoire, il doit appeler BeginRead.
- Une fois l'opération de lecture de la mémoire achevée, le thread doit appeler EndRead.
- Pour qu'un thread puisse écrire dans la mémoire, il doit appeler BeginWrite.
- Une fois l'opération d'écriture achevée, le thread doit appeler EndWrite.
Avertissement : Le synchronisateur à écriture exclusive et à lecture multiple ne fonctionne que si chaque thread l'utilise pour accéder à la mémoire globale associée. Sinon, des problèmes d'accès simultané peuvent se produire.