Проблемы с памятью и ThreadLocal <T> - PullRequest
7 голосов
/ 23 апреля 2011

Я заметил, что ThreadLocal<T> реализует IDisposable, подразумевая, что я должен избавиться от локальной переменной потока, когда я закончу ее использовать. Мне просто любопытно, каковы конкретные проблемы, и что я должен быть осторожным и / или избегать делать.

Будет ли удалено локальное хранилище потока при выходе из потока? Каков худший случай, если я не избавлюсь от своих участников ThreadLocal?

Что если у меня есть глобальная локальная переменная потока (oxymoron? Hehe) (или, альтернативно, переменная ThreadStatic), и я присваиваю это значение потокам в ThreadPool. Нужно ли быть осторожным, чтобы отменить выделение локальных значений потока, или это не проблема?

1 Ответ

5 голосов
/ 23 апреля 2011

Я не верю, что локальные потоки автоматически удаляются потоком, когда он существует - это все еще остается для реализации разработчиком. От MSDN:

Всегда вызывайте Dispose, прежде чем выпускать последнюю ссылку на ThreadLocal.В противном случае используемые им ресурсы не будут освобождены до тех пор, пока сборщик мусора не вызовет метод Finalize объекта ThreadLocal.

Однако, если ваш локальный тип потока является чем-то, что не потребляет никаких ресурсов, которыеодноразовый варрант (например, int или другой примитивный тип), вероятно, не стоит его утилизировать, так как сборщик мусора в конечном итоге с этим справится.

Обычно неразумно иметь один и тот же экземпляр ссылки на объект несколькимиThreadLocal объекты - фактически это противоречит тому, что обычно пытается достичь локальное хранилище потоков.Можно предположить, что изолированные локальные потоки являются «потокобезопасными» в том смысле, что никакие другие потоки не должны (в принципе) иметь к ним доступ.Имейте в виду, что безопасность потоков является нюансированной концепцией и требует, чтобы вы установили конкретные ограничения и ожидания в отношении разделяемой памяти ... Я использую термин в этом контексте в широком смысле.

...