2016-12-29 5 views
1

Есть ли механизм для библиотеки, снабжающей локальную переменную потока, для регистрации для нее функции конструктора?Инициализация локальной переменной потока

Я хочу, чтобы в моей библиотеке была создана потоковая локальная структура, которая должна быть инициализирована при создании потоков с динамически полученными данными.

Если структура была только глобальной, но не локальной, я бы имел функцию, помеченную gcc __attribute__((__constructor__)), но эти конструкторы не перезапускаются при создании нового потока.

ответ

3

Нет, создание потоков не вызывает никаких конструкторов. Это хорошая вещь; автоматический вызов конструкторов не будет масштабировать в потенциально большом приложении, где большинство потоков не имеют никакого отношения к вашему библиотечному коду и никогда его не назовут.

Вместо этого вам нужно либо иметь код вашей библиотеки, который использует локальный объект потока, лениво на первый вызов библиотеки в новом потоке, либо потребовать, чтобы вызывающее приложение вызывало функцию инициализации явно в потоках, которые будут использовать Это. Первый вариант, как правило, намного лучше, и влияние производительности не должно быть даже измеримым; доступ к локальному хранилищу в библиотеке занимает больше времени, чем предсказуемое отделение:

static _Thread_local int init_done; 
if (!init_done) ... 
Смежные вопросы