是否在TIdHTTPServer.OnCommandGet线程安全中使用了全局原子变量?

时间:2015-01-20 14:14:32

标签: delphi indy

我试图更好地理解Delphi Indy Server和ThreadSafe变量。

让我们说我想要一个简单的反击数量"命中"到我的Delphi Indy网络服务器。所以我宣布一个全局整数

var: GlobalWebHits: Integer

TIdHttpServer.OnCommandGet 的处理程序中,我增加了它:

procedure MyWebServer.CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  GlobalWebHits := GlobalWebHits+1;
  .....
end;

关于线程安全,这个实现是否正常?是否有可能两个线程试图在同一时间更新GlobalWebHits?

递增是否应包含在关键部分?

1 个答案:

答案 0 :(得分:2)

没有原子变量这样的东西。操作可以是原子的,也可以不是。

GlobalWebHits := GlobalWebHits+1;

这个不是原子的。它有独立的读,修改和写阶段。

您可以使用临界区,但使用原子操作更简单,更有效:

AtomicIncrement(GlobalWebHits);

TInterlocked.Increment(GlobalWebHits);

InterlockedIncrement(GlobalWebHits);

取决于您使用的Delphi版本。