Delphi threadvar问题

时间:2011-05-04 18:45:48

标签: multithreading delphi

当我们声明threadvar时,这个变量将被初始化(创建对象)?是否在var的第一次赋值时发生?例如:

threadvar
  myThreadVar : string;

......

//inside a thread
  ...
  myThreadVar := 'my value'; // In this point the var will be initialized?

如果我在线程设置了var的值之后尝试在线程外部使用此var会发生什么?例如:

//at the main thread (application)
  ...
  //Call the thread;
  //thread finishes execution
  //thread is destroyed
  ShowMessage(myThreadVar); // what happens here?

3 个答案:

答案 0 :(得分:16)

线程的线程变量在线程第一次访问它们中的任何一个时被初始化。它们被设置为默认的all-bits-zero值,对于字符串,它是空字符串。

Threadvars可能会也可能不会最终确定。这取决于线程终止时RTL获得多少通知。出于这个原因,最好不要在threadvars中存储任何动态分配的类型(包括字符串)。相反,使用TThread对象的实例变量来存储特定于线程的数据。


你问题的第二部分是胡说八道。它让您在线程终止后在线程上执行代码。没有“在线程之外”运行代码这样的事情。所有代码都以线程运行。每个程序至少有一个线程。

每个线程都有自己的threadvar副本。没有线程可以读取另一个线程的副本,所以一旦线程终止,它的所有线程变量都将无法访问。

您的ShowMessage调用将显示属于当前线程的值,而不是已终止的线程。

答案 1 :(得分:7)

创建线程时,线程本地存储将被清零(初始化)。因此,在运行第myThreadVar := 'my value';行之前,它将是一个空字符串。

至于你的第二个问题,threadvars对每个线程都是唯一的。声明threadvar时,在线程本地存储中声明一个槽,每个线程都获得一个槽的副本。您可以将其视为thread1.myThreadVarthread2.myThreadVarmainThread.myThreadVar等等。因此,如果您在一个线程中设置threadvar并尝试在另一个线程中读取它,则不会阅读你在另一个线程中设置的内容;你将阅读分配给当前线程版本的threadvar的任何内容。

答案 2 :(得分:3)

threadvar意味着每个线程都有一个变量实例。没有“在线程之外”这样的东西 - 如果你没有在你创建的显式线程中运行,那么你正在进程的默认线程上运行。如果将threadvar设置为显式线程中的值,则该值对所有其他线程都是不可见的。