Использование параллельных расширений с атрибутом ThreadStatic.Может ли это утечка памяти? - PullRequest
6 голосов
/ 12 июня 2010

Я использую Parallel Extensions довольно интенсивно, и я только что столкнулся со случаем, когда целесообразно использовать локальное хранилище потоков, чтобы разрешить повторное использование объектов рабочими потоками.Поэтому я смотрел на атрибут ThreadStatic, который помечает статическое поле / переменную как уникальное значение для каждого потока.

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

Есть ли лучший подход для получения локального хранилища потоков с помощью PE?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 12 июня 2010

Я бы настоятельно рекомендовал использовать обычный шаблон для локального хранилища потоков, описанный в этой статье MSDN .

Когда вы используете [ThreadStatic], имеет значение, очищает ли поток пула потоков переменные TLS при его завершении. В документах MSDN нет никаких указаний на то, что это не так. Это не сложно реализовать, нужно только вызвать функцию API TlsFree (). Я написал небольшое тестовое приложение, никаких признаков утечки.

4 голосов
/ 12 июня 2010

РЕДАКТИРОВАТЬ: Учитывая ответ Ганса, похоже, что TLS на самом деле будет в любом случае очищен ... что просто оставляет этот бит ответа:

У вас действительно нет лучшеспособ повторного использования значений в потоке?Если есть две задачи, использующие один и тот же поток (одна завершается, а другая выполняется), действительно ли они захотят получить одно и то же значение?Вы на самом деле просто используете это как способ избежать более контролируемого распространения данных в вашей задаче?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...