线程本地存储和线程变量

时间:2018-09-26 18:36:52

标签: windows variables process stack internals

我对TLS以及它与局部变量,全局变量和局部变量有何区别几乎没有疑问。

  1. 线程局部变量仅可用于所有者线程,而局部变量仅可用于函数?
  2. 线程局部变量存储在哪里?
  3. 何时需要使用线程局部变量?
  4. 线程局部变量的寿命是多少?
  5. 线程局部变量是否专有于线程?

通常,我无法获得局部变量和线程局部变量之间的区别。

1 个答案:

答案 0 :(得分:1)

函数中存在局部变量。函数返回后,它们就消失了。线程变量存在于线程中;一旦线程退出,它们就消失了。就生存期而言,您可以说TLV等同于线程启动函数的局部变量,除非您不必显式地将对它们的引用传递给代码。

请注意,有两种方法可以在本机Windows程序中使用TLV。 Microsoft C ++具有__declspec(thread)修饰符,并且还有一系列Windows API函数-TlsAlloc()等。

  1. 如果以某种方式将指针/引用传递给其他线程,则其他线程可以访问线程局部变量。但是,vanilla访问方法将返回当前线程的实例。

如果您在创建线程退出后尝试从另一个线程访问它,那是未定义的行为。

  1. 这是一个实现细节。但最有可能在堆上。

  2. 嗯,这取决于您。从理论上讲,他们通常使用TLV所做的几乎所有事情,您也可以不用...

  3. 只要线程正在运行。

  4. 定义“独占”。