Описание работы Linux в Uli Drepper (сопровождающий glibc) можно найти здесь: www.akkadia.org / drepper / tls.pdf
Требование обработки динамически загружаемых модулей и т. Д. Делает весь механизм немного запутанным, что, возможно, частично объясняет, почему вес документа составляет 79 страниц (!).
С точки зрения использования памяти, каждая переменная для каждого потока, очевидно, нуждается в собственной памяти для каждого потока (хотя в некоторых случаях это может быть выполнено лениво, так что пространство выделяется только после первого доступа к переменной), а затем некоторые дополнительные структуры данных, необходимые для таблиц смещения и т. д.
С точки зрения производительности дополнительные затраты на доступ к переменной TLS в основном связаны с получением адреса переменной. В x86 Linux регистр GS используется в качестве начала для получения идентификатора потока, в x86-64 FS. Обычно существует несколько разыменований указателя и вызов функции (__tls_get_addr) для динамически загружаемого кода. Кроме того, стоит отметить, что создание нового потока медленнее, поскольку реализация должна выделять пространство и, возможно, инициализировать все переменные TLS (если не выполняется лениво).
TLS удобен тем, что легко делает некоторые старые поточно-небезопасные шаблоны кода поточно-безопасными (подумайте errno), но для нового кода, разработанного с самого начала для многопоточного мира, это очень редко требуется.