我不确定我所问的是否会有任何影响。我显然是这方面的新手,但让我们假设我有一个对象:
TClientInfo = class(TObject)
Username: TIdThreadSafeString;
UserID: TIdThreadSafeInteger;
Status: TIdThreadSafeInteger;
Disconnected: TIdThreadSafeBoolean;
End;我使用disconnected作为锁,因此如果客户端与服务器断开连接,它将不会对对象的任何字段执行任何操作。现在让我们假设有两个函数同时被两个线程访问: 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;用于锁定断开连接的变量的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正在访问该对象的变量。
会发生什么呢?这会导致异常吗,还是我只是假设了一些事情(抱歉,我一直在为服务器应用程序中发生的所有异常而头疼)。如果是,那么释放对象的最安全方法是什么?
谢谢
发布于 2013-05-30 01:04:03
不要让这种情况发生--做TCP做的事情。
不要因为客户端对象已断开连接就将其释放。将它们放在'FreePending‘增量队列中,然后只在一分钟后释放它们。到那时,可能引用断开连接的客户端对象up的任何其他线程都会注意到断开连接状态,并放弃它们的操作。
https://stackoverflow.com/questions/16819054
复制相似问题