2016-12-29 112 views
1

是否有库提供线程局部变量注册构造函数的机制?初始化线程局部变量

我想让我的库提供一个线程局部结构,它应该使用动态获取的数据在线程创建时初始化。

如果结构只是全局的,但不是线程本地的,我会用gcc的__attribute__((__constructor__))标记一个函数对它进行初始化,但是这些构造函数在创建新线程时不会重新触发。

回答

3

不,线程创建不会调用任何构造函数。这是一件好事;自动调用构造函数不会在可能的大型应用程序中缩放,其中大多数线程与您的库代码无关,并且永远不会调用它。

相反,您需要使用线程本地对象的库代码在新线程的第一次库调用中构造它,或者需要调用应用程序在将使用的线程中显式调用初始化函数它。第一种选择通常要好很多,性能影响甚至不应该可以测量;访问库中的线程本地存储需要比可预测的分支更长的时间:

static _Thread_local int init_done; 
if (!init_done) ...