System.AtomicCmpExchange
Delphi
function AtomicCmpExchange(var Target; NewValue: <Integer or NativeInt or Pointer>; Comparand: <Integer or NativeInt or Pointer>; [out Succeeded: Boolean]): Integer; overload;
function AtomicCmpExchange(var Target; NewValue: <Integer or NativeInt or Pointer>; Comparand: <Integer or NativeInt or Pointer>; [out Succeeded: Boolean]): Int64; overload;
function AtomicCmpExchange(var Target; NewValue: <Integer or NativeInt or Pointer>; Comparand: <Integer or NativeInt or Pointer>; [out Succeeded: Boolean]): Pointer; overload;
function AtomicCmpExchange(var Target; NewValue: <Integer or NativeInt or Pointer>; Comparand: <Integer or NativeInt or Pointer>; [out Succeeded: Boolean]): NativeInt; overload;
function AtomicCmpExchange(var Target; NewValue: <Integer or NativeInt or Pointer>; Comparand: <Integer or NativeInt or Pointer>; [out Succeeded: Boolean]): Integer; overload;
function AtomicCmpExchange(var Target; NewValue: <Integer or NativeInt or Pointer>; Comparand: <Integer or NativeInt or Pointer>; [out Succeeded: Boolean]): Int64; overload;
function AtomicCmpExchange(var Target; NewValue: <Integer or NativeInt or Pointer>; Comparand: <Integer or NativeInt or Pointer>; [out Succeeded: Boolean]): Pointer; overload;
function AtomicCmpExchange(var Target; NewValue: <Integer or NativeInt or Pointer>; Comparand: <Integer or NativeInt or Pointer>; [out Succeeded: Boolean]): NativeInt; overload;
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
function | public | System.pas | System | System |
説明
アトミックな組み込みの 比較&交換 関数は、Target
の内容を指定された値(Comparand
)と比較し、両者が同じ場合にのみ、Target
の内容を新しい値に変更します。
この関数は、常に Target
の元の値を返します。Succeeded
パラメータが指定された場合、Succeeded
は、値の交換が行われれば(Target
と NewValue
が同じ場合も含む)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.