在Delphi中以线程安全的方式增加和返回一个整数

时间:2010-10-25 16:52:03

标签: multithreading delphi thread-safety increment

在单线程应用程序中,我使用如下代码:

Interface
    function GetNextUID : integer;
Implementation
    function GetNextUID : integer;
    const
      cUID : integer = 0;
    begin
      inc( cUID );
      result := cUID;
    end;

这当然可以作为单个对象实现,等等 - 我只是给出了最简单的例子。

问:如何修改此函数(或设计一个类)以便从并发线程安全地获得相同的结果?

3 个答案:

答案 0 :(得分:37)

您可以使用Interlocked*功能:

    function GetNextUID : integer;
    {$J+} // Writeble constants
    const
      cUID : integer = 0;
    begin
      Result := InterlockedIncrement(cUID);
    end;

更现代的Delphi版本已将这些方法重命名为Atomic*(如AtomicDecrementAtomicIncrement等),因此示例代码变为:

    function GetNextUID : integer;
    {$J+} // Writeble constants
    const
      cUID : integer = 0;
    begin
      Result := AtomicIncrement(cUID);
    end;

答案 1 :(得分:15)

最简单的方法可能就是致电InterlockedIncrement来完成这项工作。

答案 2 :(得分:5)

使用现代Delphi编译器,最好使用System.SyncObjs单元中的IncrementTInterlocked函数。像这样:

  type
    TMyClass = class
    class var
      FIdCounter: int64;
    var
      FId: int64;
    constructor Create;
    end;

constructor TMyClass.Create;
begin
  FId := TInterlocked.Increment(FIdCounter);
end;

这有助于保持代码平台无关。