Поток .NET ThreadPool получает сброс, когда он возвращается в пул? - PullRequest
12 голосов
/ 04 августа 2011

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

Есть ли "официальная" документация по этому аспекту потоков ThreadPool?

Ответы [ 3 ]

9 голосов
/ 04 августа 2011

НЕ очищает локальное хранилище потока при его освобождении, что является наиболее важным аспектом, на который следует обратить внимание.

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

Когда пул потоков повторно использует поток, онне очищает данные в локальном хранилище потока или в полях, помеченных атрибутом ThreadStaticAttribute.Следовательно, данные, помещенные в локальное хранилище потока одним методом, могут быть доступны любому другому методу, выполняемому тем же потоком пула потоков.Метод, который обращается к полю, помеченному атрибутом ThreadStaticAttribute, может встретиться с разными данными в зависимости от того, какой поток пула потоков его выполняет.

Это то, к чему нужно быть очень осторожным ...

3 голосов
/ 04 августа 2011

Ответ - нет, сброс не произойдет.Однако вам не следует полагаться на этот факт, поскольку пул потоков будет решать, будет ли следующий рабочий элемент выполняться в новом потоке или в повторно используемом потоке.Таким образом, вы можете или не можете увидеть ваш поток локального хранилища снова.По этой причине я бы не рекомендовал использовать локальное хранилище потоков в пуле потоков.Реализация пула потоков является внутренней деталью и может быть изменена.

Метафора реального мира - это автобус, который вы едете на работу каждый день.Допустим, по какой-то причине вы хотите оставить свою сумку в автобусе, потому что вы знаете, что она не будет украдена.Это плохая идея, потому что в следующий раз, когда вы садитесь в автобус, вы можете не найти свою сумку.Просто потому, что это может быть другой автобус.Автобусный парк может вращать автобусы между линиями или выбрасывать старые автобусы.Точно так же, как пул потоков может повторно использовать или удалять потоки, не сообщая вам.

2 голосов
/ 04 августа 2011

Это очень хорошее чтение по параллельному программированию и TPL в .NET (4)

Насколько я знаю, сброса нет.

В связанном документе упоминаются способы, как справиться с этим.

...