假设我有一些全局变量和一些线程局部变量在模块的静态this()中初始化(例如,TLS 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和其他全局数据.