D中的线程局部存储变量,与模块初始化器的交互混淆

假设我有一些全局变量和一些线程局部变量在模块的静态this()中初始化(例如,TL​​S a,全局b,TLS c和全局d按此顺序初始化)并在其静态中取消初始化〜( ).

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

如果我做出一个非常可怕的假设,还是纠正我?

编辑:使它更清晰:

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变量会超出某些值初始化吗?这两个(de)初始值表示的是什么?

最佳答案 有两种类型的静态构造函数:

static this() { ... }

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

shares static this() { ... }

在程序启动时运行一次,它用于初始化__gshared和其他全局数据.

点赞