Почему выходные данные этой многопоточной программы различаются, если не используется Thread.Join или не удален Thread.SC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему выходные данные этой многопоточной программы различаются, если не используется Thread.Join или не удален Thread.S

Сообщение Anonymous »

У меня есть следующая программа, в которой я создаю 1000 потоков для увеличения общей переменной a, а затем переводю каждый поток в спящий режим на 1 секунду:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»