Новая тема() и сбор мусора

У меня есть следующий код:

new Thread(new ThreadStart(delegate()
{
    while (true)
    {
        //something
    }
})).Start();

Может ли сборщик мусора завершить этот экземпляр Thread, пока он находится в состоянии Running?

Ответы

Ответ 1

CLR отслеживает все запущенные потоки. Пока есть ссылки на объекты, они не будут собирать мусор. И поскольку CLR сохраняет ссылку на все запущенные потоки, GC не будет трогать их.

Ответ 2

Нет; текущие потоки считаются корнями. Текущая нить не будет собрана и не будет ссылаться на активную часть стека для этого потока.

Ответ 3

Нить не будет собираться, потому что каждый исполняемый, ожидающий или приостановленный поток сам использует GC для определения того, что является живым (трассируйте все в каждом поточном стеке, трассируйте все, на что ссылаются все эти объекты, тогда все ссылки теми и т.д., и вы определили все, что невозможно собрать мусором).

Поток может завершиться, если это был фоновый поток, потому что тогда он будет активно закрыт, когда все остальные потоки процесса закончатся. В противном случае единственное, что может заставить его умереть, - это активный процесс, исключение (включая ThreadAbortException) или его выход из цикла while.

Там случай, который сопоставим в некотором роде, возможно, это то, о чем вы думаете:

var timer = new System.Threading.Timer(someCallback, null, new TimeSpan(0, 0, 5), new TimeSpan(0, 0, 5));
int someResult = doingSomethingElse();
doSomethingElseThatTakesLongerThan5Seconds();

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

Важно то, что для таймера нет отдельного потока, и нить даже не знает об объекте таймера. Поскольку последний доступ к объекту с тех пор произошел, он имеет право на сбор. Это отличается от вопроса об отдельном потоке, который работает (или ждет и т.д.).