Eviter les accès de threads simultanés dans la même mémoire

De RAD Studio
Aller à : navigation, rechercher

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

  1. 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.
  2. 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

  1. Créez une instance globale de TCriticalSection.
  2. Appelez la méthode Acquire pour verrouiller les autres threads pendant l'accès à la mémoire globale.
  3. 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

  1. Créez une instance globale de TMultiReadExclusiveWriteSynchronizer associée à la mémoire globale que vous souhaitez protéger.
  2. Pour qu'un thread puisse lire la mémoire, il doit appeler BeginRead.
  3. Une fois l'opération de lecture de la mémoire achevée, le thread doit appeler EndRead.
  4. Pour qu'un thread puisse écrire dans la mémoire, il doit appeler BeginWrite.
  5. 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.

Voir aussi