Страницы

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

понедельник, 24 февраля 2020 г.

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

#linux #c #pthread


В коде имеются несколько переменных типа static __thread.
Если ядро переключает контекст потока, то проблем не наблюдается.
Если самостоятельно переключить контекст потока 1, на поток 2, то поток 2 будет видеть
локальные переменные потока 1, что меня совсем не устраивает.

К сожалению, я не обнаружил стандартных средств быстро переключаться между потоками,
а механизмы сопрограмм ничего не знают про переменные __thread.

Отсюда вопрос, можно ли и как переключать контекст переменных типа __thread?

PS: Если что-то не понятно, спрашивайте, уточню. Вопросы типа: зачем/почему - игнорируются,
кому кто не нравится - отвечать не заставляю.
    


Ответы

Ответ 1



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

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

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