2009-11-23 2 views
2

Является ли локальное хранилище потоков используемым где-либо еще, кроме того, что глобальные и статические переменные являются локальными для потока? Полезен ли он в любом новом коде, который мы пишем?Использовать локальное хранилище в других местах?

ответ

4

TLS может быть полезен в новом коде. Если вам нужна глобальная переменная, которая должна быть специфичной для каждого потока (например, errno в C/C++), то это может быть поток-локальное хранилище.

+1

java.text.DateFormat - хороший пример. Вы можете повторно использовать его, но он не является потокобезопасным, поэтому один хороший способ работать с DateFormat безопасно, не создавая новый каждый раз, - это хранить его в ThreadLocal. – cjstehno

0

В эти дни errno обычно помещается в локальное хранилище потоков.

Существуют некоторые ситуации (например, общие библиотеки, такие как библиотеки DLL, которые требуют кода запуска), где проблема с локальным хранилищем потоков может быть проблемой.

1

Тематические конкретные одноэлементные объекты? Многопоточный веб-сервер, в котором каждый поток обрабатывает один запрос, существует довольно много возможностей для некоторых данных TLS (например, URL-адрес запроса или некоторые подключения к базе данных, по существу некоторые ресурсы, предназначенные для использования в любой момент при обработке запроса, если требуется), чтобы их можно было легко получить в любом месте кода, когда это необходимо.

+0

omfg S word ... :( –

+0

Singleton. Global. То же отличие. –

0

Я только нуждался для нарезания конкретной обработки ошибок и оптимизаций (в C):

__thread int cpfs_errno; 
static __thread struct Cpfs *g_cpfs; 

В данном примере это экономит мне пропускание контекста указателя struct Cpfs * через десятки функций, в которых он никогда не меняется.

Смежные вопросы