зачем использовать локальное хранилище потоков (TlsAlloc, TlsGetValue, ets) вместо локальных переменных - PullRequest
8 голосов
/ 11 июня 2011

Мой вопрос: зачем использовать механизм TLS вместо локальных переменных в функции потока? Можете ли вы привести хороший пример, или в чем преимущество TLS перед локальными переменными? Спасибо, Матеуш

Ответы [ 5 ]

7 голосов
/ 11 июня 2011

Если вы можете использовать локальные переменные, тогда делайте это, и вы всегда можете использовать локальные переменные.Только в качестве крайней меры следует использовать локальное хранилище потоков, которое имеет почти все те же недостатки, что и глобальные переменные.Хотя вы ищете причину для использования локального хранилища потоков, на самом деле, лучшая практика - искать способы избежать этого!

4 голосов
/ 11 июня 2011

TLS полезен для таких вещей, как контекстная информация о сеансе пользователя, которая является специфичной для потока, но может использоваться в различных несвязанных методах. В таких ситуациях TLS удобнее, чем передавать информацию вверх и вниз по стеку вызовов.

3 голосов
/ 21 сентября 2014

Вот хорошая ссылка от Intel об использовании локального хранилища потоков для сокращения синхронизации: https://software.intel.com/en-us/articles/use-thread-local-storage-to-reduce-synchronization

2 голосов
/ 13 октября 2014

Я знаю один очень хороший пример использования TLS. Когда вы реализуете LIBC или портируете один из вариантов LIBC на новую платформу, вам нужно, чтобы переменная 'errno' (которая на однопоточной платформе просто extern int errno) была уникальной для каждого потока. Функции LIBC просто сохраняют его в TLS текущего потока, а вызов errno просто читает его из TLS. TLS - это способ сделать любой поток библиотеки безопасным. Вы храните любой тип в «статических» или «глобальных» данных в TLS, поэтому та же самая функция, вызываемая из другого потока, не повредит ваши «статические» или «глобальные» переменные в другом потоке. Что делает вас функции, входящие из разных потоков.

1 голос
/ 11 июня 2011

Локальное хранилище потоков может использоваться для эмуляции глобальных или статических переменных для каждого потока.«Нормальные» локальные переменные не могут.

...