новая тема () и сборщик мусора - PullRequest
14 голосов
/ 26 января 2012

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

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

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

Ответы [ 4 ]

21 голосов
/ 26 января 2012

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

13 голосов
/ 26 января 2012

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

2 голосов
/ 26 января 2012

Поток не будет собран, потому что каждый работающий, ожидающий или приостановленный поток сам по себе используется 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();

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

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

0 голосов
/ 11 июля 2018

Все запущенные таймеры, потоки, пул потоков и задачи помечены как root. Таким образом, они будут собирать мусор только после завершения (завершения выполнения) или будут удалены после закрытия приложения.

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