我试图更好地理解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?
递增是否应包含在关键部分?
答案 0 :(得分:2)
没有原子变量这样的东西。操作可以是原子的,也可以不是。
GlobalWebHits := GlobalWebHits+1;
这个不是原子的。它有独立的读,修改和写阶段。
您可以使用临界区,但使用原子操作更简单,更有效:
AtomicIncrement(GlobalWebHits);
或
TInterlocked.Increment(GlobalWebHits);
或
InterlockedIncrement(GlobalWebHits);
取决于您使用的Delphi版本。