在单线程应用程序中,我使用如下代码:
Interface
function GetNextUID : integer;
Implementation
function GetNextUID : integer;
const
cUID : integer = 0;
begin
inc( cUID );
result := cUID;
end;
这当然可以作为单个对象实现,等等 - 我只是给出了最简单的例子。
问:如何修改此函数(或设计一个类)以便从并发线程安全地获得相同的结果?
答案 0 :(得分:37)
您可以使用Interlocked*
功能:
function GetNextUID : integer;
{$J+} // Writeble constants
const
cUID : integer = 0;
begin
Result := InterlockedIncrement(cUID);
end;
更现代的Delphi版本已将这些方法重命名为Atomic*
(如AtomicDecrement
,AtomicIncrement
等),因此示例代码变为:
function GetNextUID : integer;
{$J+} // Writeble constants
const
cUID : integer = 0;
begin
Result := AtomicIncrement(cUID);
end;
答案 1 :(得分:15)
最简单的方法可能就是致电InterlockedIncrement
来完成这项工作。
答案 2 :(得分:5)
使用现代Delphi编译器,最好使用System.SyncObjs单元中的Increment类TInterlocked函数。像这样:
type
TMyClass = class
class var
FIdCounter: int64;
var
FId: int64;
constructor Create;
end;
constructor TMyClass.Create;
begin
FId := TInterlocked.Increment(FIdCounter);
end;
这有助于保持代码平台无关。