Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 14.04.2022
Сообщений: 6

Задача "Спящий парикмахер"

22.05.2022, 20:22. Показов 925. Ответов 0

Студворк — интернет-сервис помощи студентам
Пытался реализовать задачу "Спящего парикмахера" на Си под Linux, но при выполнении программы выводятся некорректные данные. Я создаю несколько процессов и вывожу PID-процесса, когда он выполняет какое-то действие в задаче. В процессе выполнения в какой-то момент начинает неправильно выводиться PID-процессов. Никак не могу понять, в чём проблема. Может кто-то помочь разобраться?

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <unistd.h>
#define CHAIRS 3
 
void barber(int* mysems, int* mymsgq)
{
    struct sembuf opers[2];
    opers[0].sem_num = 0;
    opers[0].sem_op = -1;
    opers[0].sem_flg = 0;
    opers[1].sem_num = 1;
    opers[1].sem_op = -1;
    opers[1].sem_flg = 0;
    semop(*mysems, opers, 1);
    if (semctl(*mysems, 1, GETVAL) > 0)
    {
        struct msg
        {
        long mtype;
        char mtext[5];
        }message;
        message.mtype = 1;
        msgrcv(*mymsgq, &message, sizeof(message), message.mtype, 0);
        opers[0].sem_op = 1;
        semop(*mysems, opers, 2); // проверка снова разрешена
        printf("%s: стрижётся...\n", message.mtext);
        sleep(1 + rand() % 3);
        printf("%s: подстригся и уходит\n", message.mtext);
    }
    else
    {
        opers[0].sem_op = 1;        
        semop(*mysems, opers, 1);   
    }
}
 
void client(int* mysems, int* mymsgq)
{
    sleep(1 + rand() % 15);
    struct sembuf opers[2];
    opers[0].sem_num = 0;
    opers[0].sem_op = -1;
    opers[0].sem_flg = 0;
    opers[1].sem_num = 1;
    opers[1].sem_op = 1;
    opers[1].sem_flg = 0;
    semop(*mysems, opers, 1);
    if (semctl(*mysems, 1, GETVAL) < CHAIRS)
    {
        if (semctl(*mysems, 1, GETVAL) == 0)
            printf("Все кресла свободны.\n");
        struct msg
        {
        long mtype;
        char mtext[5];
        }message;
        message.mtype = 1;
        sprintf(message.mtext, "%u", getpid());
        msgsnd(*mymsgq, &message, sizeof(message), 0); // id помещено в очередь (клиент занял кресло)
        opers[0].sem_op = 1;
        semop(*mysems, opers, 2); // проверка снова разрешена
        printf("%d: занимает место и ожидает\n", getpid());
    }
    else
    {
        printf("%d: нет свободных мест, уходит\n", getpid());
        opers[0].sem_op = 1;        // необслуженный клиент разрешает 
        semop(*mysems, opers, 1);   // дальнейшую проверку
    }
}
 
int main()
{
    pid_t pid = getpid();
    int mysems = semget(IPC_PRIVATE, 2, IPC_EXCL | 0660);
    // 0 - разрешение на проверку кол-ва занятых кресел (1 - разрешена, 0 - запрещена)
    // 1 - кол-во занятых кресел
    semctl(mysems, 0, SETVAL, 1);
    semctl(mysems, 1, SETVAL, 0);
    int mymsgq = msgget(IPC_PRIVATE, IPC_EXCL | 0660);
    fork(); fork(); fork();
    srand(getpid());
    while(1)
    {
        if (getpid() == pid)
            barber(&mysems, &mymsgq);
        else
            client(&mysems, &mymsgq);
    }
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.05.2022, 20:22
Ответы с готовыми решениями:

"Спящий Парикмахер"
Одна классическая задача на синхронизацию процессов – это так называемая «задача о спящем парикмахере». Рассмотрим парикмахерскую, в...

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

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.05.2022, 20:22
Помогаю со студенческими работами здесь

Спящий парикмахер, как ни странно
Добрый день. У меня есть задача написать Спящего парикмахера. И вот тут я столкнулся с проблемой - как реализовать программу в 2...

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

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

Спящий режим
Что будет, если я отключу спящий режим?

спящий режим
добрый вечер возникла небольшая проблемка с ноутбуком ! стоит W7. Зашел в спящий режим и после этого некоторое время еще монитор...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru