gpt4 book ai didi

delphi - 断开连接时发生 IdHTTP 访问冲突

转载 作者:行者123 更新时间:2023-12-03 15:10:23 26 4
gpt4 key购买 nike

印地 10:

两个线程,线程 1 正在调用 TIdHTTP 上的 Get 并阻止读取数据。线程2将在同一个TIdHTTP上调用disconnect以中断Get。

我在 TIdHTTP 上使用摘要式身份验证,偶尔会收到 AV。

线程 1 的调用堆栈:

40491D [system.pas][System][@ClassDestroy][8989]
69EF2B [..\..\common\IdAuthenticationDigest.pas][IdAuthenticationDigest][TIdDigestAuthentication.Destroy][109]
404567 [system.pas][System][TObject.Free][8313]
6A2B69 [..\..\Common\IdHTTP.pas][IdHTTP][TIdCustomHTTP.DoOnDisconnected][1587]
534574 [IdTCPConnection.pas][IdTCPConnection][TIdTCPConnection.Disconnect][532]
534B3B [IdTCPConnection.pas][IdTCPConnection][TIdTCPConnection.Disconnect][767]
6A3FB3 [..\..\Common\IdHTTP.pas][IdHTTP][TIdCustomHTTP.DoRequest][2101]

线程 2 的调用堆栈:

402BA3 [system.pas][System][@FreeMem][2477]
404521 [system.pas][System][TObject.FreeInstance][8294]
40491D [system.pas][System][@ClassDestroy][8989]
69EF2B [..\..\common\IdAuthenticationDigest.pas][IdAuthenticationDigest] [TIdDigestAuthentication.Destroy][109]
404567 [system.pas][System][TObject.Free][8313]
6A2B69 [..\..\Common\IdHTTP.pas][IdHTTP][TIdCustomHTTP.DoOnDisconnected][1587]
534574 [IdTCPConnection.pas][IdTCPConnection][TIdTCPConnection.Disconnect][532]
534B3B [IdTCPConnection.pas][IdTCPConnection][TIdTCPConnection.Disconnect][767]

基本上在 DoRequest 结束时它会断开连接。尝试释放 Request.Authentication 的断开连接似乎存在竞争条件。

下载了 Indy 10 的最新代码并查看代码,我相信行为应该是相同的。

我相信从另一个线程调用断开连接是推荐的使用模式,我错了吗?这是印地的一个错误吗?似乎有必要锁定断开连接,但很难看出可能会造成什么死锁。还有其他人遇到过这个吗?

最佳答案

是的,您遇到的是竞争条件,两个线程都试图释放相同的 Request.Authentication当套接字断开连接时对象两次。根据堆栈跟踪,两个线程必须同时断开套接字,因为 Disconnect()只调用DoOnDisconnect()如果IOHandler仍然开放,并且 IOHandler DoOnDisconnect()之前关闭被调用。

您可以尝试使用 OnStatus进入线程安全锁的事件,例如 hsDisconnecting 中的临界区或互斥体状态,并将锁保留在hsDisconnected状态。 IOHandler.Close()DoOnDisconnect()在这些状态之间调用,这样就可以有效地序列化您的线程,这样它们就无法断开套接字并释放 Request.Authentication不再在同一时间对象。

关于delphi - 断开连接时发生 IdHTTP 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12518273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com