Что происходит с внешними переменными, если объект, создающий новый поток, удалит сборщик мусора - 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();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д