Что происходит с внешними переменными, если объект, создающий новый поток, удалит сборщик мусора - C#
Формулировка задачи:
Здравствуйте!
Недавно поймал себя на одной мысли. Что происходит с внешними переменными, если объект, создающий новый поток, удалит сборщик мусора. Набросал простейший кодТо есть, в методе В этом случае второй поток начал печатать новое значение переменной. Но в отладчике всё равно написано, что объекта
using System;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
if (true)
{
Test test = new Test(1);
test.Start();
}
Console.ReadKey();
}
}
class Test
{
public int myNum = 0;
public Test(int num)
{
this.myNum = num;
}
public void Start()
{
Thread t = new Thread(Print);
t.IsBackground = true;
t.Start();
}
protected void Print()
{
while (true)
{
Console.Write(myNum);
Thread.Sleep(50);
}
}
}
}Test.Start
создаётся новый (второй) поток, который использует общую переменнуюmyNum
. Потом объектtest
выходит за свою область видимости, что заставляет сборщик мусора удалить его вместе с его полями. То есть,myNum
тоже удаляется. Тогда откуда второй поток берёт значение этой переменной даже после её удаления? Чтоб проверить, не создаётся ли какая-то отдельная структура с попавшими в поток внешними переменными, как в случае замыкания, я написал так:// ...
static void Main(string[] args)
{
if (true)
{
Test test = new Test(1);
Thread.Sleep(1000);
test.myNum = 2;
test.Start();
}
Console.ReadKey();
}
// ...test
не существует. P.S. - сильно не кусайте за вопрос. Просто перед сном задумался и стало интересноРешение задачи: «Что происходит с внешними переменными, если объект, создающий новый поток, удалит сборщик мусора»
textual
Листинг программы
new Class().Foo();