Это исключает реализацию, инициализирующую область имен thread_local
переменная с нетерпением при создании потока, и поддерживают ли какие-либо крупные компиляторы какой-либо механизм, чтобы принудительно сделать это через некоторую аннотацию?
У меня очень небольшое количество критичных к производительности __thread
Vars я хотел бы освободить от ленивых проверок инициализации для доступа, что thread_local
обычно влечет за собой, но в настоящее время мне нужно сделать установку / разбор через отдельные вызовы, чтобы остаться в __thread
ограничения на нетривиальные деструкторы и т. д. Могу ли я получить thread_local
с гарантированной энергичной конструкцией / разрушением для каждого потока и без ленивого тестирования инициализации?
В противном случае, каков самый чистый из известных способов борьбы с __thread
настройка / завершение регистрации звонка?
Можно взять
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
}
Других решений пока нет …