Une liste thread safe, l’interface d’échange privilégiée entre deux threads

La manière la plus académique d’implémenter une application multithread est d’utiliser une interface d’échange pour séparer complètement les contextes d’exécution entre deux threads.

Avec notre exemple, on peut imaginer une classe modélisant un contexte d’exécution comme suit :

type 
 TExecutionContext= class(TObject) 
 public 
   IterMax:Extended; 
   CalculResult : double; 
end; 

Pour définir une liste d’échange thread safe, il existe deux possibilités décrites dans les sous-sections suivantes.

1. Par TCriticalSection TCriticalSection

Nous avons vu précédemment qu’on peut protéger les ressources partagées par une section critique TCriticalSection.

Ainsi, une implémentation de cette liste d’échange serait simplement :

type 
 TThreadSafeList=class(TList<TExecutionContext>) 
 private 
   FLock : TCriticalSection; 
 public 
   procedure SafePush(anItem:TExecutionContext); 
   function SafePop:TExecutionContext; 
   constructor Create;reintroduce; 
   destructor Destroy;override; 
 end; 
 
 
 
{ TThreadSafeList } 
 
constructor TThreadSafeList.Create; 
begin 
 inherited...
Pour consulter la suite, découvrez le livre suivant :
couv_RIDELPH.png
60-signet.svg
En version papier
20-ecran_lettre.svg
En version numérique
41-logo_abonnement.svg
En illimité avec l'abonnement ENI
130-boutique.svg
Sur la boutique officielle ENI
Précédent
Les concepts de ressource partagée et de section critique
Suivant
PPL : la bibliothèque de programmation parallèle