Delphi 中增加和返回整数的线程安全方法
在单线程应用程序中,我使用这样的代码:
Interface
function GetNextUID : integer;
Implementation
function GetNextUID : integer;
const
cUID : integer = 0;
begin
inc( cUID );
result := cUID;
end;
这当然可以作为单例对象实现,等等 - 我只是给出最简单的示例。
问:如何修改此函数(或设计一个类)以从并发线程安全地获得相同的结果?
In a single-threaded application I use code like this:
Interface
function GetNextUID : integer;
Implementation
function GetNextUID : integer;
const
cUID : integer = 0;
begin
inc( cUID );
result := cUID;
end;
This could of course be implemented as a singleton object, etc. - I'm just giving the simplest possible example.
Q: How can I modify this function (or design a class) to achieve the same result safely from concurrent threads?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用
Interlocked*
函数:更现代的 Delphi 版本已将这些方法重命名为
Atomic*
(如AtomicDecrement
、AtomicIncrement
) code> 等),因此示例代码变为:You can use the
Interlocked*
functions:More modern Delphi versions have renamed these methods into
Atomic*
(likeAtomicDecrement
,AtomicIncrement
, etc), so the example code becomes this:最简单的方法可能是直接调用
InterlockedIncrement< /code>
来完成这项工作。
The easiest way would probably be to just call
InterlockedIncrement
to do the job.对于现代 Delphi 编译器,最好使用 Increment 函数来自 System.SyncObjs 单元的 TInterlocked 类。像这样:
这有助于保持代码平台独立性。
With modern Delphi compilers it is better to use Increment function of class TInterlocked from unit System.SyncObjs. Something like this:
This helps to keep the code platform-independent.