CompareExchangeGlobalVar

Qubes 6.6 Effectue un échange conditionnel atomique de la valeur d'une GlobalVar

Syntaxe

function CompareExchangeGlobalVar(n: String; v: Variant; c: Variant): Variant
n : nom de la variable globale
v : nouvelle valeur
c : valeur à comparer

Remarques

Cette fonction effectue de manière atomique les opérations suivantes :

  • retourne la valeur initiale de la variable globale n
  • si cette valeur initiale est égale à c, la fonction écrit v dans la variable globale

NB : Si la variable globale interrogée n'est pas définie, la valeur initiale retournée par la fonction est le variant Unassigned.

Cette fonction est atomique. Cela signifie que si un autre script ou un autre traitement (dans une autre thread du même exécutable) essaie d'interagir avec cette variable globale, il devra attendre que les opérations de cette fonction soient terminées.
Ainsi, ce n'est pas la même chose que de faire appel successivement à ReadGlobalVar et à WriteGlobalVar, car la valeur lue pourrait avoir été changée par un autre traitement avant que l'écriture ait lieu.

Elle permet de mettre en place des verrous légers ou des mécanisme de mises à jour d'états thread-safe.

Voir aussi CompareExchangePrivateVar.

Exemples

// Verrou d'accès exclusif
var lockName:='MaGlobalVarQuiSertDeVerrou';
var lockOwner:='Description du nouveau traitement qui veut prendre le verrou';

// Récupération du propriétaire actuel du verrou et prise du verrou s'il est disponible
var currentLockOwner:=CompareExchangeGlobalVar(lockName, lockOwner, Unassigned);

if currentLockOwner<>Unassigned then begin
   ErrorDlg('La variable est déjà verrouillée par le traitement '+currentLockOwner);
end else begin
   try
      // Traitements protégés
      // par le verrou exclusif
   finally
      // Libération du verrou, avec alerte si il a été usurpé entre temps
      currentLockOwner:=CompareExchangeGlobalVar(lockName, Unassigned, lockOwner);
      if currentLockOwner<>lockOwner then
         InformationDlg('Attention : le verrou n''a pas été respecté par le traitement '+currentLockOwner);
   end;
end;

Classification

Internal GlobalVars