首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi7 MultiThreading混淆

问Delphi7 MultiThreading混淆
EN

Stack Overflow用户
提问于 2013-05-30 00:15:52
回答 1查看 170关注 0票数 0

我不确定我所问的是否会有任何影响。我显然是这方面的新手,但让我们假设我有一个对象:

代码语言:javascript
复制
TClientInfo = class(TObject)
   Username: TIdThreadSafeString;
   UserID: TIdThreadSafeInteger;
   Status: TIdThreadSafeInteger;
   Disconnected: TIdThreadSafeBoolean;
End;

我使用disconnected作为锁,因此如果客户端与服务器断开连接,它将不会对对象的任何字段执行任何操作。现在让我们假设有两个函数同时被两个线程访问: Thread1和Thread2

代码语言:javascript
复制
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并执行操作,最后它释放断开连接的变量以及对象(保留其他变量)。

现在还有另一个函数:

代码语言:javascript
复制
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正在访问该对象的变量。

会发生什么呢?这会导致异常吗,还是我只是假设了一些事情(抱歉,我一直在为服务器应用程序中发生的所有异常而头疼)。如果是,那么释放对象的最安全方法是什么?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-05-30 01:04:03

不要让这种情况发生--做TCP做的事情。

不要因为客户端对象已断开连接就将其释放。将它们放在'FreePending‘增量队列中,然后只在一分钟后释放它们。到那时,可能引用断开连接的客户端对象up的任何其他线程都会注意到断开连接状态,并放弃它们的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16819054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档