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

140
16 мая 2022, 15:00

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

  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 в другие места поместить?

READ ALSO
Index was outside the bounds of the array

Index was outside the bounds of the array

Если честно, даже предположений нет в чём ошибкаВозникает после запуска в одном из двух мест, в зависимости от того, какое из чисел больше

303
Цикл по получению значения из JSON

Цикл по получению значения из JSON

Есть такой код, который работает до получения финального значения из JSONСам файл выглядит примерно вот так:

180
создать блок(меню ul&gt;li) в js без использования html

создать блок(меню ul>li) в js без использования html

Нужно сделать меню(ul>li*5) в js без html, изначально body в файле indexhtml должен быть пустой, все необходимые элементы генерируются с использованием...

216
js и элементы на странице

js и элементы на странице

Всем приветПрошу помощи

269