假设我有一些全局变量和一些线程局部变量被初始化(例如,TLS a
,全局b
,TLS c
和全局d
已初始化按顺序)在模块中静态this()并在其静态〜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变量会超出某些值初始化吗?这两个(de)初始化器意味着什么?
答案 0 :(得分:2)
有两种类型的静态构造函数:
static this() { ... }
每当新线程启动时都会运行。它的目的是初始化线程本地存储(TLS)变量。
shares static this() { ... }
在程序启动时运行一次,它用于初始化__gshared和其他全局数据。
答案 1 :(得分:0)
好的,经过深入挖掘并编写了一些测试代码后,我认为我已经掌握了它,没有__gshared变量的细节。
从here开始,每个线程运行一次模块静态构造函数。它的静态解构函数在线程返回时运行。模块的行为类似于每个线程的伪类“实例”,其“成员”变量是它们的TLS变量,它们的__gshared
变量就像该类的静态变量。在我看来,这形成了关系
对象:class
:: module
:[__gshared
变量的逻辑集合]
和
[无资格者]:static
:: [无资格者]:__gshared
其中每个关系的后半部分由多线程和静态构造函数/析构函数构成。
然后,我理解的漏洞是__gshared
如何适合模块初始化。
希望其他人能够提出一个更好的答案,填补我能接受的那个洞。