Не могу синхронизировать потоки c#

Задание: Необходимо разработать программу, в которой было реализовано два потока (нити). Эти потоки должны запускаться одновременно и сортировать один и тот же массив двумя разными способами:

  1. методом пузырька.
  2. методом выбора максимума.

В программе должны использоваться следующие механизмы:

  • для одновременного запуска процессов необходимо использовать семафор, т.е. поток, который в коде запускается первым, должен ожидать запуск второго потока.
  • правильность сортировки массива должна быть обеспечена с помощью критических секций.
  • в программе должна быть предусмотрена возможность отключения критических секций, при этом необходимо показать , что массив будет отсортирован неверно (для увеличения вероятности возникновения ошибки рекомендуется использовать оператор sleep()).

по нажатии в кнопку Генерэйт справа в textbox выведется массив с случайными числами. При нажати на кнопку Сорт снизу в textbox выводится уже отсортированный массив. Если в Чекбокс стоит галочка, то только один поток(одна из двух сортировок) может работать с данными(массив чисел), а другой поток ждет.

Вот обработчик события, когда нажимаем на кнопку Сорт:

 private void btnSort_Click(object sender, EventArgs e)
    {
        textBox1.Clear();
        void Bubble()
        {
            for (int i = 0; i < 9; i++)
                for (int j = 0; j < 9 - i; j++)
                {
                    if (checkBox.Checked == true) sem.WaitOne();
                    if (array[j] > array[j + 1])
                    {
                        swap(ref array[j], ref array[j + 1]);
                        Thread.Sleep(39);
                    }
                    if (checkBox.Checked == true) sem.Release();
                }
        }

        Thread one = new Thread(Bubble);
        one.Start();


        for (int i = 0; i < 9; i++)
        {
            int min = i;
            for (int j = i + 1; j < 10; j++)
            {
                if (checkBox.Checked == true) sem.WaitOne();
                if (array[j] < array[min])
                {
                    min = j;
                    Thread.Sleep(39);
                }
                if (checkBox.Checked == true) sem.Release();
            }
            swap(ref array[min], ref array[i]);
        }

Проблема в том, что иногда алгоритм работает правильно, а иногда неправильно, подскажите где мне нужно что изменить, где-то м.б. мне waitone и release в другие места поместить? введите сюда описание изображения


Ответы (0 шт):