System.AtomicCmpExchange

提供: RAD Studio API Documentation
移動先: 案内検索

Delphi

function AtomicCmpExchange(var Target: Integer; NewValue: Integer; Comparand: Integer): Integer; overload;
function AtomicCmpExchange(var Target: Int64; NewValue: Int64; Comparand: Int64): Int64; overload;
function AtomicCmpExchange(var Target: Pointer; NewValue: Pointer; Comparand: Pointer): Pointer; overload;
function AtomicCmpExchange(var Target: Integer; NewValue: Integer; Comparand: Integer; out Succeeded: Boolean): Integer; overload;
function AtomicCmpExchange(var Target: Int64; NewValue: Int64; Comparand: Int64; out Succeeded: Boolean): Int64; overload;
function AtomicCmpExchange(var Target: Pointer; NewValue: Pointer; Comparand: Pointer; out Succeeded: Boolean): Pointer; overload;

プロパティ

種類 可視性 ソース ユニット
function public System.pas System System


説明

アトミックな組み込みの 比較&交換 関数は、Target の内容を指定された値(Comparand)と比較し、両者が同じ場合にのみ、Target の内容を新しい値に変更します。

この関数は、常に Target の元の値を返します。Succeeded パラメータが指定された場合、Succeeded は、値の交換が行われれば(TargetNewValue が同じ場合も含む)True に、行われなければ False になります。

System ユニットには、メモリ値の交換、比較および交換、インクリメント、デクリメントをアトミックに行う手段となる 4 つのアトミックな組み込み関数が用意されています。

AtomicCmpExchange はメモリ値の比較および交換に使用されます。

アトミック操作は以下の目的に使用されます。

  • マルチスレッド ロック プリミティブの実装
  • いわゆる "ロックフリー" 構造の実装に必要なプリミティブの提供

サンプル コード

program SystemAtomicCmpExchange;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, Winapi.Windows;

var
  Target,
  Comparand,
  Return : Integer;
  Succeeded : Boolean;

const
  ReplaceValue = Integer(5);

begin
  try
    WriteLn('System.AtomicCmpExchange');
    WriteLn;

    Target := 1;
    Comparand := 0;
    WriteLn(Format('Initial values: Target: %d, Comparand: %d, ReplaceValue : %d',
      [Target, Comparand, ReplaceValue]));
    Return := System.AtomicCmpExchange(Target, ReplaceValue, Comparand, Succeeded);
    WriteLn(Format('After calling:  Target: %d, Comparand: %d, Return: %d, Succeeded: %s',
      [Target, Comparand, Return, BoolToStr(Succeeded, true)]));

    WriteLn;

    Target := 1;
    Comparand := 1;
    WriteLn(Format('Initial values: Target: %d, Comparand: %d, ReplaceValue : %d',
      [Target, Comparand, ReplaceValue]));
    Return := System.AtomicCmpExchange(Target, ReplaceValue, Comparand, Succeeded);
    WriteLn(Format('After calling:  Target: %d, Comparand: %d, Return: %d, Succeeded: %s',
      [Target, Comparand, Return, BoolToStr(Succeeded, true)]));

    WriteLn;
    WriteLn('InterlockedCompareExchange');
    WriteLn;

    Target := 1;
    Comparand := 0;
    WriteLn(Format('Initial values: Target: %d, Comparand: %d, ReplaceValue : %d',
      [Target, Comparand, ReplaceValue]));
    Return := InterlockedCompareExchange(Target, ReplaceValue, Comparand);
    WriteLn(Format('After calling:  Target: %d, Comparand: %d, Return: %d',
      [Target, Comparand, Return]));

    WriteLn;

    Target := 1;
    Comparand := 1;
    WriteLn(Format('Initial values: Target: %d, Comparand: %d, ReplaceValue : %d',
      [Target, Comparand, ReplaceValue]));
    Return := InterlockedCompareExchange(Target, ReplaceValue, Comparand);
    WriteLn(Format('After calling:  Target: %d, Comparand: %d, Return: %d',
      [Target, Comparand, Return]));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

関連項目