我在学习多线程编程,遇到一个问题不解,请大家帮忙解答,谢谢我建立一个线程类:
=======================================type
  TMyThread = class(TThread)
  private
    fMyObjectInHeap: TStringList;
  protected
    procedure Execute; override; { 略 }
  public
    constructor Create;
    destructor Destroy; overide; { 略 }
  end;implementationconstructor TMyThread.Create;
begin
  inherited Create(True);
  fMyObjectInHeap := TStringList.Create;
end;=======================================我想请教一下:
  1.如果一个线程的父线程(不是主线程,是主线程的子线程)中止,则该线程是否仍然执行?
  2.在上面表示的线程的实例运行时,如果fMyObjectInHeap对象究竟是在进程的空间分配
    的,抑或是在父线程的堆栈中分配的,还是在该实例自身的堆栈中分配的。  事实上我想知道的是当,ThreadA(不是主线程)创建了MyThread: TMyThread,当ThreadA
  中止时,MyThread是否仍然在运行,并可以访问到Self.fMyObjectInHeap而没有页保护错误?
  还有就是,当MyThread中止时(即使是TerminateThread调用引起), fMyObjectInHeap占用
  的空间自动释放?

解决方案 »

  1.   

    我所理解的:
      1、当MyThread中止时,fMyObjectInHeap占有的空间并不会自动释放,除非你自己去Free它。
      2、ThreadA(不是主线程)创建了MyThread,当ThreadA中止时,MyThread依然可以运行,这是毫无疑问的,你可以访问MyThread线程局部存储的的变量以及全局变量。
      

  2.   

    1. 看你线程之间的联系,如果子线程之间梅没必然联系,那么子线程当然继续运行。2.堆和栈不是一个东西,你的这个实例是在堆里面申请的。fMyObjectInHeap 不会随着线程的终止自动释放,但是会随着进程的终止为释放。
      

  3.   

    谢谢两位,等下给分。
    to pazee, 我还有个疑问,你的意思是:Win32只为线程分配栈,而堆则在整个进程范围内共享吗?
      

  4.   

    不是的。一般win32的数据能存在三个地方,数据段、堆和栈。
    数据段一般是主线程的全局静态变量的存在的地方,
    函数内的局部变量大部分都是在堆里面,这个堆是按照B+树来建立的数据表。
    函数内动态创建的东西一定在堆上,
    pascal 不支持在栈或者数据段建立对象实例,只能在堆上。堆对于整个进程是只有一个的,里面的数据是否能共享,还是要看你变量的有效范围,和对对本身关系。