Delphi threadvar问题

Raf*_*cci 13 delphi multithreading

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

threadvar
  myThreadVar : string;

......

//inside a thread
  ...
  myThreadVar := 'my value'; // In this point the var will be initialized?
Run Code Online (Sandbox Code Playgroud)

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

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

Rob*_*edy 17

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

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


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

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

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

  • 我认为通过"在线程之外",他的意思是"在我为其分配值的线程之外",而不是"根本不在任何线程中".但你是对的,它反映了对threadvars性质的根本误解. (4认同)

Mas*_*ler 7

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

至于你的第二个问题,threadvars对每个线程都是唯一的.声明threadvar时,在线程本地存储中声明一个槽,每个线程都获得一个槽的副本.你可以把它看作一种像thread1.myThreadVar,thread2.myThreadVar,mainThread.myThreadVar等等.所以,如果你在一个线程设置一个threadvar,并尝试在另一个读它,你会看不懂你在其它线程设置; 你会读到分配给当前线程的threadvar版本的内容.