Возможна ли активная инициализация thread_local в C ++?

[basic.stc.thread] утверждает, что «переменная с продолжительностью хранения потока должна быть инициализирована до его первого использования (6.2) и, в случае его создания, должны быть уничтожены на выходе из нити «.

Это исключает реализацию, инициализирующую область имен thread_local переменная с нетерпением при создании потока, и поддерживают ли какие-либо крупные компиляторы какой-либо механизм, чтобы принудительно сделать это через некоторую аннотацию?

У меня очень небольшое количество критичных к производительности __thread Vars я хотел бы освободить от ленивых проверок инициализации для доступа, что thread_local обычно влечет за собой, но в настоящее время мне нужно сделать установку / разбор через отдельные вызовы, чтобы остаться в __thread ограничения на нетривиальные деструкторы и т. д. Могу ли я получить thread_local с гарантированной энергичной конструкцией / разрушением для каждого потока и без ленивого тестирования инициализации?

В противном случае, каков самый чистый из известных способов борьбы с __thread настройка / завершение регистрации звонка?

3

Решение

Можно взять thread_local с гарантированной энергичной конструкцией / разрушением для каждого потока и без ленивого тестирования инициализации?

Навряд ли.

В противном случае, каков самый чистый из известных способов борьбы с __thread настройка / завершение регистрации звонка?

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

struct ThreadContext {
thread_local static ThreadContext* instance;

ThreadContext() {
assert(!instance);
instance = this;
}

~ThreadContext() {
instance = 0;
}

ThreadContext(ThreadContext const&) = delete;
ThreadContext& operator=(ThreadContext const&) = delete;
};

thread_local ThreadContext* ThreadContext::instance = 0;

void thread_function() {
ThreadContext context;

// Access it elsewhere as:
ThreadContext::instance;
}

ThreadContext* getThisThreadContext() {
return ThreadContext::instance;
// No init check here. Just one move:
// mov rax, QWORD PTR fs:ThreadContext::instance@tpoff
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]