Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/29: Рейтинг темы: голосов - 29, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147

Семафоры

26.05.2019, 11:21. Показов 6132. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте
Задача: разработать комплекс программ, который демонстрирует решения по-дачи «читатели-писатели». В комплекс должны входить: программа-монитор, программа-писатель, программа-читатель.
В программе мониторе можно запускать на выполнение и завершать любое количество программ-писателей и программ-читателей, отслеживать и выводить в графическом виде состояние общего для всех программ буфера
31
(Содержание буфера, состояние блокировки Состав групп читателей и писателей; очереди процессов, ожидающих регистрацию в группах), выводить информацию, которую зап-суют писатели и считывают читатели.
Программа-писатель и программа-читатель могут быть запущены на вы-полнение в нескольких экземплярах одновременно, но не более 6 вместе (читатели + писатели в любом соотношении, ограничения организовать с помо-щью объекта ядра операционной системы - Job). В буфере сохраняется тексто-е данные, объем буфера - от 10 до 20 символов.
Операции чтения и записи оформить таким образом, чтобы их выполнение занимало от 3 до 10 секунд каждая (время определяется случайным образом). Бу-фер разместить в общей для всех процессов памяти с помощью файла, что отражено в память.


Синхронизация с помощью семафор(преимущество у писателей тоесть когда пишет писатель в этот момент никто из читателей не может читать )
Не пойму как даже близко реализовать подскажите пожалуйста кто может
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2019, 11:21
Ответы с готовыми решениями:

Win32 и Семафоры
Здравствуйте! Проблема: 1-й поток нормально работает. Семафор переключается. А во втором потоке - нет. Как вывести результаты со...

Критическая секция и семафоры
Посмотрите пожалуйста правильно ли я сделал программу. Нужно было написать программу, в которой при помощи семафоров оформить операцию a++...

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

22
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.05.2019, 12:09
Цитата Сообщение от Lunch Посмотреть сообщение
Синхронизация с помощью семафор(преимущество у писателей тоесть когда пишет писатель в этот момент никто из читателей не может читать )
С помощью семафоров ты сможешь организовать только контроль размера очереди, не более того.
Для читателей-писателей нужно использовать shared_mutex.
Вообще, основная проблема - кто будет удалять сообщения из очереди.
И, насколько я понимаю, тебе нужно чтобы читатели-писатели были в разных процессах. В этом случае всё намного сложнее.
0
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
26.05.2019, 12:24  [ТС]
да именно это и нужно

Добавлено через 3 минуты
скоро сдача а у меня в процессах нету этого только жалкие наработки синхронизации нитей и всё и то там не всё гладко
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
26.05.2019, 14:33
Lunch
Как я понимаю задание, поправьте если не прав.
Есть один общий буфер.
Читатель читает информацию из буфера, буфер при этом не меняется.
Писатель перезаписывает своей информацией буфер.
То есть в буфере всегда лежит информация только от одного писателя.
Каждый писатель пишет свою информацию, отличную от других писателей.


Никогда не делал блокировку на семафорах и не очень представляю сам алгоритм. Можно так попробовать.
Создаём семафор на N элементов.
Читатель ждёт один элемент. Если дождался, то читает буфер и освобождает семафор.
Писатель ждёт N элементов.
Если дождался всех N, то перезаписывает буфер и освобождает семафор N раз.

Тут есть проблема, как ждать сразу N элементов?
Если делать это в цикле, то потенциально возможен дедлок.
Два писателя начинают блокировку и забирают по одному элементу.
Теперь ни один из писателей не сможет получить все N элементов.

При неудачной попытке нужно освобождать блокировку и пробовать снова.
В общем, какой-то не внятный алгоритм блокировок выходит.
Думать надо, как обойти дедлок.
Второй вариант реализации, сделать через WaitForMultipleObjects.
Передать в функцию N одинаковых хендлов на семафор и ждать общей блокировки.
Не знаю, работает ли это так и избавит ли такой способ от дедлоков.
Этот вариант нужно проверять экспериментально.

Если вам дали это задание, значит ранее была озвучена какая-то теория по семафорам.
Объясняли вам, каким образом делать такую блокировку?

И задание про статус в мониторе не очень понятно.
Содержание буфера - понятно (что там лежит),
Состояние блокировки - почти понятно (выполнена, выполняется, ?не выполняется?),
Состав групп читателей и писателей - понятно (сколько писателей, сколько читателей),
Очереди процессов, ожидающих регистрацию в группах - совсем не понятно.
0
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
26.05.2019, 15:15  [ТС]
по поводу очереди Приоритет у писателей тоесть он пишет и в этот момент никто не может читать и никто не может писать вместе с ним .

Добавлено через 2 минуты
по поводу блокировки у семафор есть макс количество потоков которые получают доступ к информации
hSem = CreateSemaphore(NULL, 1, 1, "MySemaphore1"); тут 1 получает доступ максимум ну это для примера
после того как поток заверщил работу он уходит и даёт сигнал следующему который занимает его место

Добавлено через 1 минуту
честно говоря мне и самому сложно вам объяснить потому я слабо в этом разбираюсь было супер если бы вышло реализовать

Добавлено через 15 минут
По поводу как делать именно такой вариант работы обьснения небыло но нам рассказывали именно как работают семафоры
Программа монитор я думаю должна управлять процессами читателей и писателей и вызывать их по очереди(тоесть программы запускать) а так же выводить результаты записей и чтения файла
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
26.05.2019, 15:41
Проверил, вариант с WaitForMultipleObjects не работает. Нельзя одинаковые хендлы указывать.

по поводу блокировки у семафор есть макс количество потоков которые получают доступ к информации
hSem = CreateSemaphore(NULL, 1, 1, "MySemaphore1"); тут 1 получает доступ максимум ну это для примера
после того как поток заверщил работу он уходит и даёт сигнал следующему который занимает его место
Это не подходит для RW-блокировки. Так любой поток будет блокировать работу остальных, а не только записывающий.
При RW-блокировке с общими данными одновременно может работать несколько R-потоков.

Программа монитор я думаю должна управлять процессами читателей и писателей и вызывать их по очереди(тоесть программы запускать) а так же выводить результаты записей и чтения файла
Как это вызывать по очереди? Я так думал, что программа работает бесконечно, повторяя в цикле свою операцию. Монитор может запустить такую программу и остановить её. Но как только программа запущена, она не завершается сама. Если монитор будет запускать программы по очереди, то и блокировок никаких не нужно.

Нужно понять смысл слова "очередь" в данном контексте.
Можно предположить, что речь про очередь блокировок.
Не каждая реализация RW-блокировок использует очередь.
Возможно тут речь про какую-то конкретную реализацию RW-блокировки.
0
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
26.05.2019, 16:23  [ТС]
без понятия я инфы вообще нарыть не могу чтобы понять как это написать
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.05.2019, 16:51
Цитата Сообщение от Ygg Посмотреть сообщение
Как я понимаю задание, поправьте если не прав.
Есть один общий буфер.
Читатель читает информацию из буфера, буфер при этом не меняется.
Писатель перезаписывает своей информацией буфер.
То есть в буфере всегда лежит информация только от одного писателя.
Каждый писатель пишет свою информацию, отличную от других писателей.
Писатель блокирует данные на запись (буфер) и никто другой не может их ни записать ни прочитать. Читатель блокирует на чтение - никто не может записать, но другие читатели могут тоже блокировать на чтение и читать. Это std::shared_mutex или SRWLOCK в Win32.
Но! Это должно быть в одном процессе, для нескольких это реализовывать бессмысленно.
0
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
26.05.2019, 16:53  [ТС]
писатель их блокирует только когда пишет

Добавлено через 53 секунды
читать могут все а писать только один пока один пишет остальные не могут чистать
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.05.2019, 16:54
В нескольких процессах - тебе нужно будет организовать взаимодействие между ними.
0
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
26.05.2019, 16:57  [ТС]
да по идее

Добавлено через 24 секунды
все они работают с файлом текстовым
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.05.2019, 16:57
Это называется клиент-сервер. Сервер - хранит буфер и принимает данные от других процессов. Для каждого внешнего процесса пусть будет отдельный поток (херово, но пока сойдёт)
0
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
26.05.2019, 16:58  [ТС]
я пишу программу которая запускает эти программы пусть якобы по несколько раз в зависимости от количества писателей и читателей
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.05.2019, 16:59
Когда на сервер приходят данные от процесса-писателя, он блокирует буфер на запись и копирует в него эти данные

Добавлено через 1 минуту
Когда приходит запрос от читателя - блокирует буфер на чтение, копирует данные и отправляет их ему
0
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
26.05.2019, 17:00  [ТС]
наверное так и есть
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.05.2019, 17:05
Монитором может выступать собственно сам сервер, семафор ему понадобится только чтобы контролировать количество коннектов

Добавлено через 4 минуты
В общем, здесь надо сначала реализовать сервер, потом определиться с механизмом взаимодействия между процессами и реализовать его, ну а всё остальное уже мелочи
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
26.05.2019, 17:26
Если процессов мало (всего 6), то можно сделать RW-блокировку ещё так.
Создаём 6 разных семафоров по 1 элементу.
Блокировка на чтение WaitForMultipleObjects(6, <all_semaphores>, FALSE, INFINITE)
Блокировка на запись WaitForMultipleObjects(6, <all_semaphores>, TRUE, INFINITE)
0
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
26.05.2019, 17:47  [ТС]
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
#include "windows.h"
#include <iostream>
#include "process.h" 
using namespace std;
HANDLE hSemaphore;
DWORD WINAPI myFun(LPVOID lpParam) {
    WaitForSingleObject(hSemaphore,INFINITE);
    cout << "Critical Section1"<<endl;
    ReleaseSemaphore(hSemaphore, 1, 0);
    return 0;
}
 
DWORD WINAPI myFun2(LPVOID lpParam) {
    WaitForSingleObject(hSemaphore, INFINITE);
    cout << "Critical Section" << endl;
    ReleaseSemaphore(hSemaphore, 1, 0);
    return 0;
}
 
void Work() {
 
    cout << "Helllo";
}
 
int main() {
    HANDLE hThread1(Work);
    HANDLE hThread2;
    hSemaphore = CreateSemaphore(
        NULL,   // нет атрибута
        1// начальное состояние
        1// максимальное состояние
        NULL    // без имени
    );
    if (NULL == hSemaphore)
    {
        cout << "Semaphore Creation Failed & Error No - " << GetLastError() << endl;
 
 
 
    }
 
 
    cout << "Semaphore Creation Success"<<endl;
 
    hThread1 = CreateThread(NULL, 0, &myFun, NULL, 0, 0);
 
 
    hThread2 = CreateThread(NULL, 0, &myFun2, NULL, 0, 0);
    
    WaitForSingleObject(hThread1,INFINITE);
    WaitForSingleObject(hThread2, INFINITE);
 
    CloseHandle(hThread1);
    CloseHandle(hThread2);
 
    CloseHandle(hSemaphore);
    system("pause");
    return 0;
}
А это будет правильно если я ещё разобью по процессам и буду работать с файлом?
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
26.05.2019, 18:42
Цитата Сообщение от Lunch Посмотреть сообщение
А это будет правильно если я ещё разобью по процессам и буду работать с файлом?
Ещё имя семофору дать, что бы он шарился между процессами. И это будет обычная блокировка, а не RW.
0
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
26.05.2019, 19:19  [ТС]
Может можно что-то дописать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.05.2019, 19:19
Помогаю со студенческими работами здесь

Семафоры. Поток не дожидается свей очереди.
#include &lt;Windows.h&gt; HDC hdc; HWND hwnd; DWORD dwWaitResult; ...

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

Семафоры
Помогите решить задачу. Есть пример, но делаю по аналогии не получается. #include &lt;cstdlib&gt; #include &lt;iostream&gt; ...

Семафоры
Нужно написать программу &quot;Басейн&quot;. У нас есть 3 команды спортсменов. Красные , зеленые и лиловые. Каждая команда ненавидит 2 другие. ...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru