Проблемы с работой многопоточной программы в области синхронизации работы потоков
Дана следующая задача: С клавиатуры вводится число роботов, собирающих игрушки, и число наборов для сборки. Число наборов для сборки игрушек должно превышать число роботов не менее чем в 100 раз. Каждый робот собирает игрушку за некоторое время, попадающее в диапазон, введенный с клавиатуры пользователем(заменён на случайное число). Когда игрушка собрана, робот берет новый набор для сборки игрушки, пока все наборы не будут собраны. Каждый робот работает в отдельном потоке. Работать в WinForms.
Для этого был создан вот этот код:
public bool stop;
List<Thread> threads = new List<Thread>();
int[] robots;
int numberSets = 0;
Random random = new Random();
object locker = new object();
private void button1_Click(object sender, EventArgs e)
{
if (Convert.ToInt32(numberRobots.Text) * 100 <= Convert.ToInt32(numberSet.Text))
{
robots = new int[Convert.ToInt32(numberRobots.Text)];
for (int i = 0; i < Convert.ToInt32(numberRobots.Text); i++)
{
robots[i] = i + 1;
}
for (int i = 0; i < Convert.ToInt32(numberRobots.Text); i++)
{
threads.Add(new Thread(new ParameterizedThreadStart(CreatSet)));
threads[i].Name = $"Робот {i + 1}";
threads[i].Start(Convert.ToInt32(robots[i]));
}
}
else
{
Console.WriteLine("Неправильно!");
}
}
public void CreatSet(object obj)
{
int numberRobot = (int)obj;
while (numberSets != Convert.ToInt32(numberSet.Text))
{
int tsb = random.Next(50, 100);
numberSets++;
lock (locker)
{
var message = $"• {Thread.CurrentThread.Name} начал сбор набора №{numberSets}. Время сбора набора: {tsb} секунд;";
Invoke((MethodInvoker)delegate
{
infAssembly.Items.Add(message);
});
}
var message1 = $"• {Thread.CurrentThread.Name} закончил сбор набора №{numberSets}.";
Thread.Sleep(tsb);
Invoke((MethodInvoker)delegate { infAssembly.Items.Add(message1); });
//Thread.Sleep(random.Next(50, 100));
}
var message2 = $"• Наборы для сборки закончились.";
Invoke((MethodInvoker)delegate { infAssembly.Items.Add(message2); });
}
Вроде как он работает, но выдаёт подобную ахинею, что завершается первым поток с не меньшим временем сборки.
Лечиться это удалением lock
.
Но тут же возникает дилемма, что этот lock
зачем-то в этой программе нужен по требованию препода, вопреки логики заявления "Роботы должны работать параллельно друг другу". Короче, как мне переписать программу так, что бы и lock
был, и одновременно с этим они работали параллельно?