初始化线程局部变量
Initializing a thread local variable
是否有一种机制可以让提供线程局部变量的库为其注册构造函数?
我想让我的库提供一个线程局部结构,该结构应该在创建线程时使用动态获取的数据进行初始化。
如果结构只是全局的而不是线程局部的,我会用一个标有 gcc __attribute__((__constructor__))
的函数来初始化它,但是这些构造函数不会在创建新线程时重新触发。
不,线程创建不调用任何构造函数。这是一件好事;在大多数线程与您的库代码无关并且永远不会调用它的潜在大型应用程序中,构造函数的自动调用不会扩展。
相反,您需要让使用线程局部对象的库代码在新线程中的第一次库调用时延迟构造它,或者要求调用应用程序在线程中显式调用初始化函数,这将用它。第一种选择通常要好得多,而且性能影响甚至无法衡量;访问库中的线程本地存储比可预测的分支需要更长的时间:
static _Thread_local int init_done;
if (!init_done) ...
是否有一种机制可以让提供线程局部变量的库为其注册构造函数?
我想让我的库提供一个线程局部结构,该结构应该在创建线程时使用动态获取的数据进行初始化。
如果结构只是全局的而不是线程局部的,我会用一个标有 gcc __attribute__((__constructor__))
的函数来初始化它,但是这些构造函数不会在创建新线程时重新触发。
不,线程创建不调用任何构造函数。这是一件好事;在大多数线程与您的库代码无关并且永远不会调用它的潜在大型应用程序中,构造函数的自动调用不会扩展。
相反,您需要让使用线程局部对象的库代码在新线程中的第一次库调用时延迟构造它,或者要求调用应用程序在线程中显式调用初始化函数,这将用它。第一种选择通常要好得多,而且性能影响甚至无法衡量;访问库中的线程本地存储比可预测的分支需要更长的时间:
static _Thread_local int init_done;
if (!init_done) ...