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