当我们声明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?
答案 0 :(得分:16)
线程的线程变量在线程第一次访问它们中的任何一个时被初始化。它们被设置为默认的all-bits-zero值,对于字符串,它是空字符串。
Threadvars可能会也可能不会最终确定。这取决于线程终止时RTL获得多少通知。出于这个原因,最好不要在threadvars中存储任何动态分配的类型(包括字符串)。相反,使用TThread
对象的实例变量来存储特定于线程的数据。
你问题的第二部分是胡说八道。它让您在线程终止后在线程上执行代码。没有“在线程之外”运行代码这样的事情。所有代码都以线程运行。每个程序至少有一个线程。
每个线程都有自己的threadvar副本。没有线程可以读取另一个线程的副本,所以一旦线程终止,它的所有线程变量都将无法访问。
您的ShowMessage
调用将显示属于当前线程的值,而不是已终止的线程。
答案 1 :(得分:7)
创建线程时,线程本地存储将被清零(初始化)。因此,在运行第myThreadVar := 'my value';
行之前,它将是一个空字符串。
至于你的第二个问题,threadvars对每个线程都是唯一的。声明threadvar时,在线程本地存储中声明一个槽,每个线程都获得一个槽的副本。您可以将其视为thread1.myThreadVar
,thread2.myThreadVar
,mainThread.myThreadVar
等等。因此,如果您在一个线程中设置threadvar并尝试在另一个线程中读取它,则不会阅读你在另一个线程中设置的内容;你将阅读分配给当前线程版本的threadvar的任何内容。
答案 2 :(得分:3)
threadvar意味着每个线程都有一个变量实例。没有“在线程之外”这样的东西 - 如果你没有在你创建的显式线程中运行,那么你正在进程的默认线程上运行。如果将threadvar设置为显式线程中的值,则该值对所有其他线程都是不可见的。