4

假设我有一些全局变量和一些线程局部变量在模块的静态 this() 中被初始化(例如, TLS a、 global b、 TLSc和 globald按顺序初始化)并在其静态 ~this() 中取消初始化。

有人可以指导我完成程序在单线程和多线程应用程序中初始化变量所采取的步骤吗?

或者如果我做出了一个非常可怕的假设,请纠正我?

编辑:为了让它更清楚一点:

module mymodule;
int a;
__gshared int b;
int c;
__gshared d;
static this()
{
  a = 2; b = 3; c = 4; d = 1337;
}
static ~this()
{
  if(a == 2)
    dosomefunc(b);
  // and other nonsensical things that involve branching on the TLS and using the globals.
}

当我在某个生成的线程中更改 a 的值,但从未在主线程中触摸它时会发生什么?dosomefunc()曾经被叫过吗?这里应该有什么实际行为,该行为依赖于什么?关于 TLS,如何调用模块初始化程序?它们是否只被调用一次,并且 TLS 变量得到了超出一些值初始化的轴?这两个(去)初始化器到底是什么意思

4

2 回答 2

2

有两种类型的静态构造函数:

static this() { ... }

每当启动新线程时都会运行它。它的目的是初始化线程本地存储(TLS)变量。

shares static this() { ... }

在程序启动时运行一次,用于初始化 __gshared 等全局数据。

于 2013-08-15T07:47:45.863 回答
0

好的,在深入挖掘并编写了一些测试代码之后,我我已经掌握了它,没有 __gshared 变量的细节。

这里开始,每个线程运行一次模块静态构造函数。它的静态解构器在线程返回时运行。模块的行为有点像每个线程的伪类“实例”,它们的“成员”变量是它们的 TLS 变量,它们的__gshared变量就像该类的静态变量。在我看来,这形成了关系

object: class:: :[变量module的逻辑集合]__gshared

[无限定符]: static:: [无限定符]:__gshared

其中每个关系的后半部分由多线程和静态构造函数/析构函数形成。

那么,在我的理解中留下的漏洞是如何__gshared适应模块初始化。

希望其他人提出一个更好的答案来填补我可以接受的那个漏洞。

于 2013-08-10T02:11:23.933 回答