Детерминированная утилизация объектов ThreadStatic - PullRequest
10 голосов
/ 25 сентября 2008

Атрибут ThreadStatic объявляет статическую переменную как уникальную для каждого потока. Знаете ли вы простой способ правильно расположить такие переменные?

То, что мы использовали до ThreadStatic, это ThreadContextManager. Каждому потоку был присвоен ThreadContext, в котором сохранена вся информация, относящаяся к потоку. Мы породили некоторые темы и позволили им работать. Затем, когда они все закончили, мы избавились от ThreadContentManager, который, в свою очередь, удалил все контексты, если они были IDisposable.

Я не вижу непосредственного способа перевести этот шаблон в объекты ThreadStatic. Объекты будут удалены в конечном итоге, потому что потоки умирают, и поэтому ничто не ссылается на них. Тем не менее, мы предпочитаем детерминированное распоряжение всякий раз, когда это возможно.

Обновление

Я не контролирую потоки напрямую - я использую Microsoft CCR, в которой есть ThreadPool, который выполняет задачи. Когда все задачи выполнены, я избавляюсь от Dispatcher (который содержит пул потоков). Дело в том, что у меня нет возможности что-либо сделать «в конце основной функции потока», поэтому я не могу утилизировать вещи вручную в конце выполнения потока. Могу ли я как-то получить доступ к статическим объектам потока из-за пределов потока?

1 Ответ

1 голос
/ 25 сентября 2008

Вы все еще можете использовать эквивалент вашего класса ThreadContextManager для обработки утилизации. Созданные потоки избавляются от этого объекта 'manager', который, в свою очередь, удаляет все статические объекты других потоков, о которых он знает.

Я предпочитаю иметь относительно немного потоковых статических объектов и использовать вместо них объект контекста. Это сохраняет конкретное состояние потока только в нескольких местах и ​​упрощает подобные шаблоны.

Обновление: для обработки случая пула потоков вы можете создать базовый объект 'task', который вы передадите в пул потоков. Он может выполнить любую общую инициализацию, необходимую вашему коду, вызвать «реальную» задачу, а затем выполнить любую необходимую очистку.

...