初始化线程局部变量

时间:2016-12-29 21:14:43

标签: c gcc pthreads clang c11

是否有一种机制为库提供线程局部变量来为它注册构造函数?

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

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

1 个答案:

答案 0 :(得分:3)

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

相反,你需要让你的库代码使用线程局部对象在新线程的第一个库调用中懒惰地构造它,或者要求调用应用程序在将使用它的线程中显式调用初始化函数。第一种选择通常要好得多,性能影响甚至不可测量;访问库中的线程本地存储所花费的时间比可预测的分支要长:

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