我不确定我所问的是否会产生任何影响。我显然是这个东西的新手,但让我们假设我有一个对象:
TClientInfo = class(TObject)
Username: TIdThreadSafeString;
UserID: TIdThreadSafeInteger;
Status: TIdThreadSafeInteger;
Disconnected: TIdThreadSafeBoolean;
End;
我使用disconnect作为锁定,因此如果客户端与服务器断开连接,它将不会对该对象的任何字段执行任何操作。现在让我们假设有两个函数同时由两个线程访问:Thread1和Thread2
function client_disconnected()
var Client: TClientInfo;
begin
Client := FindClient(someusername);
Client.Disconnected.Lock;
Try
Client.Disconnected.Value := True;
Some operations......
Finally
Client.Disconnected.Unlock;
FreeAndNil(Client.Disconnected);
FreeAndNil(Client);
End;
end;
用于锁定disconnected变量的disconnect例程将其值设置为true并执行操作,最后释放已断开连接的变量以及对象(保留其他变量)。
现在有另外一个功能:
function someoperations()
Var Client: TClientInfo;
begin
Client := FindClient(somename);
Client.Disconnected.Lock;
Try
If Client.Disconnected.Value = True Then Exit;
some operations.....
Finally
Client.Disconnected.Unlock;
End;
end;
现在两个线程同时访问这两个函数,客户端断开连接,Thread1锁定了断开连接的变量,而Thread2在等待执行断开连接例程时尝试锁定断开连接的变量以进行操作断开连接的变量已解锁。现在,同时Thread1尝试释放对象及其变量,而Thread2正在访问该对象的变量。
会发生什么?它会导致异常,还是我只是假设(对不起,我一直在用我的服务器应用程序中发生的所有异常来敲打我的脑袋)。如果是,那么释放对象最安全的方法是什么?
由于
答案 0 :(得分:0)
不要让这种情况发生 - 做TCP的工作。
请勿释放客户端对象,因为它们已断开连接。把它们放在'FreePending'增量队列中,只有一分钟后才能释放它们。到那时,任何其他可能引用断开连接的客户端对象的线程都会注意到断开状态并放弃了它们的操作。