gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:00:59 24 4
gpt4 key购买 nike

假设我在模块的静态 this() 中初始化了一些全局变量和一些线程局部变量(例如,TL​​S a、全局 b、TLS c 和全局 d 按该顺序初始化)并在其静态 ~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 变量得到了超出一些值初始化的轴?这两个(去)初始化器到底是什么意思?

最佳答案

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

static this() { ... }

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

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

关于d - D 中的线程局部存储变量,与模块初始化程序的交互混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com