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