Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/47: Рейтинг темы: голосов - 47, средняя оценка - 4.85
1 / 1 / 1
Регистрация: 29.09.2013
Сообщений: 88

Семафоры для синхронизации потоков и для их одновременного запуска

04.06.2020, 22:28. Показов 8869. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую Всех!
Нужно написать программу, которая сортирует массив 2-мя способами (выбором и пузырьком), при этом эти способы запускаются одновременно в потоках (там для наглядности ошибки сортировки добавляется sleep и для восстановления сортировки lock), но не в этом проблема. Проблема следующая: для синхронизации потоков нужно создать семафоры для каждого потока свой и еще один для одновременного запуска потоков. Не поддаются мне эти семафоры, может кто поможет?
Пока что имею такой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
            Semaphore s1 = new Semaphore(1,2);
            Semaphore s2 = new Semaphore(1,2);
            Semaphore s3 = new Semaphore(2,2);
 
            object locker = new object();
 
            Thread Puzir = new Thread(
                delegate ()
                {
                    s1.WaitOne();
                    s2.Release();
                    int l;
                    lock (locker)
                        for (int i = 0; i < a.Length; i++)
                    {
                        for (int j = i + 1; j < a.Length; j++)
                        {
                            Thread.Sleep(100);
                            if (a[i] > a[j])
                            {
                                l = a[i];
                                a[i] = a[j];
                                a[j] = l;
                            }
                        }
                    }
                    s2.WaitOne();
                    s1.Release();
                });
 
            Thread Max = new Thread(
                delegate()
                {
                    s2.WaitOne();
                    s1.Release();
                    lock (locker)
                        for (int i = a.Length - 1; i >= 1; i--)
                    {
                        int max = i;
                        for (int j = i - 1; j >= 0; j--)
                        {
                            Thread.Sleep(100);
                            if (a[max] < a[j])
                            {
                                max = j;
                            }
                        }
                        int l = a[i];
                        a[i] = a[max];
                        a[max] = l;
                    }
                    s1.WaitOne();
                    s2.Release();                  
                });
            
            Puzir.Start();
            Max.Start();
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2020, 22:28
Ответы с готовыми решениями:

Понятие синхронизации потоков и процессов. Семафоры и мьютексы
Хотелось бы обсудить и уточнить некоторые понятия: 1. Корректно ли следующее утверждение. Синхронизация - это обеспечение...

Семафоры для динамически созданных потоков
Помогите разобраться, я динамически создаю поток, который имеет общие переменные с головным потоком. Для избежания конфликтов использую,...

Подходит ли shared_mutex в данном случае для одновременного доступа нескольких потоков к одному ресурсу?
три потока работают с одной очередью. поток READ считывает данные из файла и по одной строке и записывает в очередь. Поток WRITE записывает...

12
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
05.06.2020, 01:09
Зачем вы ставите lock внутри лямбда выражения? Делается по другому, создание метод (рабочую функцию) и если вам нужно запустить её в двух потоках, то то запускаете функцию в двух потоках.

Добавлено через 2 минуты
Посмотрите видео, о том как ими пользоваться и у автора есть примеры не только использования семафоров, плейлист посмотрите.
https://youtu.be/t9yfCrI-fRw
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
05.06.2020, 09:48
Цитата Сообщение от rafN1 Посмотреть сообщение
при этом эти способы запускаются одновременно в потоках
Один и тот же массив сортировать разными способами и одновременно в двух потоках? Это ты сам придумал, или задание такое?
0
1 / 1 / 1
Регистрация: 29.09.2013
Сообщений: 88
05.06.2020, 14:33  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Это ты сам придумал, или задание такое?
Такое задание, понимаю, что бред, но через семафоры и критические секции нужно показать синхронизацию процессов, есть способы сделать это легче, но обязательные условия, чтоб были: потоки, семафоры и критические секции

Добавлено через 3 минуты
Цитата Сообщение от xellan24rus Посмотреть сообщение
Зачем вы ставите lock внутри лямбда выражения?
Видимо, не до конца разобрался с этой функцией. Lock по заданию у меня выполняет роль критической секции, которую нужно поставить в критические участки сортировки. Видео, которое Вы скинули я смотрел несколько раз и понял, как работает 1 семафор, но мне нужны отдельные семафоры для каждой сортировки и еще один для совместного запуска потоков (по заданию)
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
05.06.2020, 16:14
Цитата Сообщение от rafN1 Посмотреть сообщение
Видео, которое Вы скинули я смотрел несколько раз и понял, как работает 1 семафор
Посмотрите лучше весь плейлист. Там подробно описано как выполнить вашу задачу. И зачем использовать два семофора на один метод????? Одного достаточно будет.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
05.06.2020, 17:43
Цитата Сообщение от rafN1 Посмотреть сообщение
но через семафоры и критические секции нужно показать синхронизацию процессов, есть способы сделать это легче, но обязательные условия, чтоб были: потоки, семафоры и критические секции
Показать, именно, на сортировке одного и того же массива в разных потоках? Или это ты решил показать на этом?
0
1 / 1 / 1
Регистрация: 29.09.2013
Сообщений: 88
05.06.2020, 23:03  [ТС]
Цитата Сообщение от xellan24rus Посмотреть сообщение
И зачем использовать два семофора на один метод?????
Если я не ошибаюсь метода 2: один сортирует массив пузырьком, другой выбором максимума.
Цитата Сообщение от nd2 Посмотреть сообщение
Показать, именно, на сортировке одного и того же массива в разных потоках?
Именно на одном, задача заключается в том, чтобы синхронизировать работу потоков (разных сортировок), без них сортировка не работает, получается каша из-за того, что 2 потока берут одновременно данные из общего массива, мне же нужно, используя семафоры и критические секции, так скажем сделать так, чтобы сначала один поток отсортировал массив правильно, а потом второй поток отсортировал отсортированный массив (извиняюсь за туфталогию, но именно так и надо сделать!). Когда решу эту задачу, критические секции будут на чекбоксе, и получается без галочки сортировка будет неправильной, а с ним все в порядке. Как-то так, смысл этой задачи мне до конца не ясен, но сделать надо
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
05.06.2020, 23:14
Цитата Сообщение от rafN1 Посмотреть сообщение
смысл этой задачи мне до конца не ясен
Исходный текст задачи (без твоего изложения) можно увидеть?
0
1 / 1 / 1
Регистрация: 29.09.2013
Сообщений: 88
05.06.2020, 23:47  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Исходный текст задачи (без твоего изложения) можно увидеть?
Задание: Необходимо разработать программу, в которой было реализовано два потока (нити). Эти потоки должны запускаться одновременно и сортировать один и тот же массив двумя разными способами:
1. методом пузырька.
2. методом выбора максимума.

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



Возможный порядок выполнения лабораторной работы

1. Создать рабочую форму приложения (консольные программы не принимаются). На форме должно быть 5 элементов:
• Кнопка генерации массива.
• Поле вывода сгенерированного массива
• Чек-бокс использования критических секций
• Кнопка сортировки массива
• Поле вывода отсортированного массива.
3. Создать глобальный массив. Написать процедуру заполнения его случайными числами по нажатию кнопки генерации.
4. Написать две процедуры сортировки этого массива. Проверить их работоспособность в обычном, (без поточном) режиме.
5. Организовать запуск процедур сортировки в отдельных потоках. Использовать команды создания и запуска потоков. (Вывод результатов сортировки должен поломаться)
6. Добавить семафоры для синхронизации вывода результатов, т.е. результат должен выводить по окончанию работы обоих потоков. У каждого потока должен быть свой семафор.
7. Добавить семафор для одновременного запуска потоков.
8. Выделить критические участки сортировки и добавить в них sleep, для наглядной демонстрации не синхронной работы потоков.
9. Добавить критические секции (команда lock ()) в потоки. Правильность сортировки должна восстановится. Критические секции привязать к соответствующему чекбоксу.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
06.06.2020, 08:57
Лучший ответ Сообщение было отмечено rafN1 как решение

Решение

Если строго по заданию (только через семафоры; для одновременного запуска сортировок - отдельный семафор; ожидание, в основном потоке, окончания работы потоков - через семафоры; для каждого потока - свой семафор):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public class Sort
{
    public static int[] a = new int[10] { 7, 1, 3, 4, 0, 9, 6, 8, 5, 2 };
    
    public static Semaphore smf1 = new Semaphore(0, 1); // для синхронизации вывода в основном потоке
    public static Semaphore smf2 = new Semaphore(0, 1); // для синхронизации вывода в основном потоке
    public static Semaphore smf  = new Semaphore(0, 2); // для одновременного запуска двух сортировок
 
    static object locker = new object();
    
    public static void sort1()
    {
        smf.WaitOne(); // ждёт открытия семафора
        Console.WriteLine("sort1");
        smf.Release(); // открывает семафор для второго потока
        
        for (int i = 0; i < a.Length; i++)
        {
            for (int j = i + 1; j < a.Length; j++)
            {
                if (a[i] > a[j])
                {   
                    int temp = a[i];
                    temp = a[i];
                    
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }
        smf1.Release(); // открывает семафор для основного потока
    }
 
    public static void sort2()
    {
        smf.Release(); // открывает семафор для первого потока
        Console.WriteLine("sort2");
        smf.WaitOne(); // ждёт открытия семафора
        
        for (int i = a.Length - 1; i >= 1; i--)
        {
            
            int max = i;
            for (int j = i - 1; j >= 0; j--)
            {
                
                if (a[max] < a[j])
                {
                    max = j;
                }
            }
            int temp = a[i];
            a[i] = a[max];
            a[max] = temp;
        }
        smf2.Release(); // открывает семафор для основного потока
    }
    
    public static void print(int[] a)
    {
        for (int i = 0; i < My.a.Length; i++)
        {
            Console.Write("{0} ", My.a[i]);
        }
        Console.WriteLine();
    }
};
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main()
{
            Thread th1 = new Thread(Sorting.sort1);
            Thread th2 = new Thread(Sorting.sort2);
            
            th1.Start();
            th2.Start();
            
            Sorting.smf1.WaitOne(); // ожидает завершения первого потока
            Sorting.smf2.WaitOne(); // ожидает завершения второго потока
            
            Sorting.print(Sorting.a);    // вывод результата сортировок
}
1
1 / 1 / 1
Регистрация: 29.09.2013
Сообщений: 88
06.06.2020, 13:50  [ТС]
Вот тут:
C#
1
2
            Thread th1 = new Thread(Sorting.sort1);
            Thread th2 = new Thread(Sorting.sort2);
Не могу разобраться откуда появился "Sorting" (ошибка: имя не существует в текущем контексте), создал потоки следующим образом:
C#
1
2
            Thread th1 = new Thread(sort1);
            Thread th2 = new Thread(sort2);
Не ругается все нормально, но вот в строчках (тут я вместо Sorting написал sort1 и sort2):
C#
1
2
            Sorting.smf1.WaitOne(); // ожидает завершения первого потока
            Sorting.smf2.WaitOne(); // ожидает завершения второго потока
Ошибка что-то типа: является методом, который не допустим в данном контексте

Добавлено через 15 минут
На кнопку сортировки написал такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void button2_Click(object sender, EventArgs e)
        {
            Thread th1 = new Thread(Puzir);
            Thread th2 = new Thread(Max);
 
            th1.Start();
            th2.Start();
 
            smf1.WaitOne(); 
            smf2.WaitOne(); 
 
            Class1.Out(k, a, textBox2); //вывод отсортированного массива
        }
При нажатии на кнопку программа зависает, если закоментить семафоры, то сортировка неправильная получается

Добавлено через 36 минут
Дело было в Sleep-е, все работает!
Я заметил, что у вас есть такая переменная, но она нигде не используется:
Цитата Сообщение от nd2 Посмотреть сообщение
static object locker = new object();
Это же получается критическая секция (переменная-замок), она по заданию необходима, но у Вас, а соответственно и у меня программа работает без нее. Что с этим делать?
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
06.06.2020, 20:00
rafN1, посмотрите видео с канала, перепишете его код с экрана в его примерах, он в несколько потоков считает одним циклом от 0 до 10. Там он рассказывает про синхронизацию данных, в отдельном видео есть про семафоры и как ими пользоваться. Зачем вы в коде передаете потоку семафор??? В поток нужно передавать метод, а в методе будет присутствовать где семафор запускается, а где он дает сигнал другом потоку что предыдущих поток отработал. И зачем вы используете семафоры когда даже не знаете как работает lock.

Добавлено через 2 минуты
Описано про lock и как этим пользоваться
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
07.06.2020, 17:24
Цитата Сообщение от rafN1 Посмотреть сообщение
Не могу разобраться откуда появился "Sorting"
Sort на Sorting поменял, оттуда и появился.

Добавлено через 3 минуты
Цитата Сообщение от rafN1 Посмотреть сообщение
Это же получается критическая секция (переменная-замок), она по заданию необходима, но у Вас, а соответственно и у меня программа работает без нее. Что с этим делать?
Работает (то есть - нет кривой сортировки) пока слипов нет. Я не добавлял критические секции, оставил тебе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2020, 17:24
Помогаю со студенческими работами здесь

Использование mutex для синхронизации двух потоков
Доброго времени суток! Никак не могу понять, как нужно использовать мьютексы для синхронизации потоков. Например, в моей задаче есть два...

Использовать или мьютекс или монитор для синхронизации потоков
Ребят, дошел до синхронизации потоков, и застрял. В делфи по моему было это проще. Короче суть задания использовать или мьютекс или...

Объекты синхронизации. мьютексы, семафоры
помогите пожалуйста. . Реализовать на семафоре мьютекс. Количественные характеристики мьютекса должны быть аналогичны соответствующему...

Семафоры(7 потоков)
Требуется создать программу которая будет создавать 7 потоков и в каждом выполнять операцию а=а-1(изначально установить а=10). Доя решение...

Запрет одновременного запуска приложения на двух PC
Всем доброго, уважаемые! Задался таким вопросом - как можно предотвратить одновременный запуск приложения на двух абсолютно разных PC,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru