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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы