DEPHI的TThread类拾遗

最近发现以前写的代码里面TThread日志不完全,老是缺线程关闭的日志.研究了一下,发现是以前对线程理解有误,参见了一下Delphi下的Tthread代码
function ThreadProc(Thread: TThread): Integer;
var
  FreeThread: Boolean;
begin
{$IFDEF LINUX}
  
if  Thread.FSuspended then sem_wait(Thread.FCreateSuspendedSem);
{$ENDIF}
  
try
    
if  not Thread.Terminated then
    
try
      Thread.Execute;
    except
      Thread.FFatalException :
=  AcquireExceptionObject;
    end;
  
finally
    FreeThread :
=  Thread.FFreeOnTerminate;
    Result :
=  Thread.FReturnValue;
    Thread.DoTerminate;
    Thread.FFinished :
=  True;
    SignalSyncEvent;
    
if  FreeThread then Thread.Free;
{$IFDEF MSWINDOWS}
    EndThread(Result);
{$ENDIF}
{$IFDEF LINUX}
    
//  Directly call pthread_exit since EndThread will detach the thread causing
    
//  the pthread_join in TThread.WaitFor to fail.  Also, make sure the EndThreadProc
    
//  is called just like EndThread would do. EndThreadProc should not return
    
//  and call pthread_exit itself.
     if  Assigned(EndThreadProc) then
      EndThreadProc(Result);
    pthread_exit(Pointer(Result));
{$ENDIF}
  end;
end;

从这里看出,其实TThread类是调用BeginThread来实现的,而线程关闭的时候(无论是Destroy或者 OnTerminate)其实是调用了主线程来处理关闭方法的.所以以往在主线程CLOSE的时候来记录线程释放的日志基本上会不成功.嘿嘿.所以以后关闭程序前要读个秒表来个LOAD过程

这里联想到,以往写的代码里面有很多线程释放的时候再来释放数据库链接、释放类实例,貌似都执行不到的(也可能是DEBUG不到)。做了一下试验,在Thread里面加了几个数据库链接,然后没有在Thread的Destroy里面CLOSE链接就直接释放Thread。结果,数据库链接好像也被关闭了,嘿嘿,难道是操作系统弄的还是数据库客户端来关的?还是未搞懂线程释放的话线程内资源是如何释放的!

你可能感兴趣的:(thread)