Код: Выделить всё
using System;
using System.Diagnostics;
using System.Diagnostics.Metrics;
using System.Runtime.CompilerServices;
using System.Threading;
class Program
{
static volatile int a = 0;
static void Main()
{
List threads = new List();
for (int i = 0; i < 1000; i++)
{
var t = new Thread(() =>
{
a++;
Thread.Sleep(1000);
});
t.Start();
threads.Add(t);
}
// foreach(Thread t in threads) t.Join();
Thread.Sleep(60000);
Console.WriteLine(a);
Console.ReadKey();
}
}
Когда я запускаю этот код с включенной строкой Thread.Sleep(1000) и закомментированным t.Join(), выходные данные Console.WriteLine(a) меньше 1000, хотя я даю 60 секунд для завершения потоков.
Если я раскомментирую цикл t.Join() или закомментирую Thread.Sleep(1000), выходные данные постоянно равны 1000.
Вопросы:
Почему выходные данные различаются, когда Thread.Sleep(1000) присутствует, а t.Join() закомментирован?
Почему вывод становится последовательным (всегда 1000), когда используется t.Join() или Thread.Sleep(1000) удален?
Я был бы признателен за объяснение того, что здесь происходит с точки зрения поведения потоков и синхронизации. Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/792 ... oin-is-use