gpt4 book ai didi

multithreading - 释放线程时死锁

转载 作者:行者123 更新时间:2023-12-03 18:26:58 25 4
gpt4 key购买 nike

在释放工作线程时遇到一些问题,我只是不明白为什么在线程的OnTerminate事件处理程序(TMaster.slvsrch_termination)中释放线程时会出现死锁。
我使用postmessage而不是在线程执行中同步来同步一些VCL控件,只是为了避免死锁。

procedure Tsrch_slave_thread.Execute;
var
activesearch: integer;
begin
activesearch := 1;
FMaster.CMD_SEARCH;
FSW.Start;
while not terminated do begin
postmessage( FDevTree_HWND, WM_STOPPER_REFRESH, trunc(Fsw.ElapsedMilliseconds / 1000), integer(FMasterNode) );
//
if (SimpleEvent.WaitFor( SEARCH_DELAY_SEC ) <> wrTimeOut) or (activesearch <> 1) then break;
activesearch := Fmaster.CMD_LISTCNT;
FSW.Stop;
end;
end;

procedure Tsrch_slave_thread.DoTerminate;
begin
inherited;
self.simpleEvent.SetEvent;
end;

线程的FreeOnTerminate属性已设置为false:
...
Fslave_search_thread: Tsrch_slave_thread;
...
Fslave_search_thread.FreeOnTerminate := false
Fslave_search_thread.OnTerminate := slvsrch_termination;
...

procedure TMaster.slvsrch_termination(Sender: TObject);
begin
...
if Assigned(Fslave_search_thread) then
begin
Fslave_search_thread.free; //Deadlock, why?
Fslave_search_thread := nil;
end;
...
end;

最佳答案

发生死锁是因为线程的析构函数在线程上等待。它调用WaitFor这样做。从slvsrch_termination调用线程的析构函数。那就是线程的OnTerminate事件处理程序。 OnTerminate事件处理程序在主线程中执行,因为它们是通过调用Synchronize来调用的。

这是死锁。它的进度是这样的:

  • 线程Execute完成,并且线程运行其终止代码。
  • 线程终止代码同步到主线程上。此时,从属线程正在通过对Synchronize的调用来等待主线程。
  • 在主线程上运行的线程终止代码会破坏从属线程。这导致线程上的WaitFor。现在,主线程正在等待从属线程。

  • 第2步和第3步是您的僵局。

    除了死锁之外,从属线程实例从其自己的 OnTerminate处理程序中释放出来也是一个错误。查看线程过程中的代码:
    FreeThread := Thread.FFreeOnTerminate;
    Thread.DoTerminate;
    Thread.FFinished := True;

    您的 OnTerminate处理程序是从对 DoTerminate的调用中调用的。返回时, Thread已被销毁,但是代码仍然可以访问它。此外,请查看您的以下代码:
    procedure Tsrch_slave_thread.DoTerminate;
    begin
    inherited;
    self.simpleEvent.SetEvent;
    end;
    inherited调用 OnTerminate处理程序。这样就释放了实例。然后,您访问实例。

    最重要的是,您不得从该线程的 OnTerminate处理程序中释放该线程。

    关于multithreading - 释放线程时死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24205174/

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