Я использую Параллельные Расширения справедливо в большой степени, и я сейчас встретился со случаем, где использование локальной памяти потока могло бы быть разумным для разрешения повторного использования объектов рабочими потоками. Как таковой я смотрел на атрибут ThreadStatic, который отмечает статическое поле/переменную как наличие уникального значения на поток.
Мне кажется, что было бы неблагоразумно использовать PE с атрибутом ThreadStatic без любой гарантии повторного использования потока PE. Таким образом, если потоки создаются и уничтожаются, до некоторой степени был бы переменные (и таким образом возражает, что они указывают на), остаются в локальной памяти потока для некоторого неопределенного количества времени, таким образом вызывая утечку памяти? Или возможно устройство хранения данных потока связывают с потоками и избавляются, когда потоки расположены? Но затем у Вас все еще потенциально есть потоки в пуле, которые очень хотятся, жил и которые накапливают локальную память потока от различных частей кода, для которого используются потоки.
Существует ли лучший подход к получению локальной памяти потока с PE?
Слова благодарности.
Я настоятельно рекомендую использовать обычный шаблон для локального хранилища потоков, описанный в этой статье MSDN .
Когда вы используете [ThreadStatic], важно то, очищает ли поток пула потоков переменные TLS при завершении. В документах MSDN нет никаких предположений, что это не так. Реализовать это несложно, достаточно вызвать API-функцию TlsFree (). Я написал небольшое тестовое приложение, никаких доказательств утечки.
РЕДАКТИРОВАТЬ: Учитывая ответ Ганса, похоже, что TLS на самом деле будет очищен в любом случае ... что просто оставляет этот бит ответа:
Вы действительно нет лучшего способа повторного использования значений в потоке? Если есть две задачи, которые используют один и тот же поток (одна завершается, затем другая запускается), действительно ли им нужно одно и то же значение? Вы на самом деле просто используете это как способ избежать более контролируемого распространения данных в рамках вашей задачи?