Страницы

Поиск по вопросам

понедельник, 6 мая 2019 г.

Где находится указатель контекста переменных thread local?

В коде имеются несколько переменных типа static __thread. Если ядро переключает контекст потока, то проблем не наблюдается. Если самостоятельно переключить контекст потока 1, на поток 2, то поток 2 будет видеть локальные переменные потока 1, что меня совсем не устраивает.
К сожалению, я не обнаружил стандартных средств быстро переключаться между потоками, а механизмы сопрограмм ничего не знают про переменные __thread
Отсюда вопрос, можно ли и как переключать контекст переменных типа __thread?
PS: Если что-то не понятно, спрашивайте, уточню. Вопросы типа: зачем/почему - игнорируются, кому кто не нравится - отвечать не заставляю.


Ответ

Вот тут, кажется, все подробно расписано: https://www.akkadia.org/drepper/tls.pdf
Вкратце: на архитектуре x86-64 переменные TLS хранятся в сегменте FS. При этом там есть определенная структура данных, которая позволяет, в том числе, получить адреса этих же переменных в сегменте DS (чтобы можно было получить на них указатель). Заголовок этой структуры хранится по адресу FS:0.
Дальше разбирайтесь сами :)
PS а в Windows для x64 эта структура находится по адресу GS:0

Комментариев нет:

Отправить комментарий