Проводится ли инициализация thread_local в каждом потоке в контексте этого потока - PullRequest
0 голосов
/ 15 января 2020

Если у меня есть переменная с классом хранения thread_local с динамическим инициализатором c, она, вероятно, инициализируется несколько раз: один раз, по крайней мере, для каждого потока, в котором она используется.

Происходит ли эта инициализация в контексте вновь созданного потока, или возможно, что это происходит в другом потоке?

В частности, будет работать любая из следующих операций:

thread_local int tid1 = pthread_self();

thread_local int tid2 = syscall(SYS_gettid);

... в смысле tid1 и tid2 получают правильный идентификатор для текущего потока.

1 Ответ

2 голосов
/ 15 января 2020

В Windows и Visual C ++ это делается через TLS (Thread Local Storage). Функции TLS выполняются в контексте своих потоков.

Подробнее: здесь и здесь .

Комментарий @ ALX23z правильный - такие переменные должен быть доступен для функции ОС, иначе их адрес памяти будет виден всем.

Конечно, компилятор также может создавать разные адреса памяти с одним и тем же именем переменной. В этом случае TLS не будет использоваться, а &var будет отличаться указателем для каждого потока. Но это потребует работы на уровне компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...