Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
2354 / 1772 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
1

Consumer-Producer на семафорах

19.05.2013, 18:56. Показов 1602. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый день. Есть программа
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
#include <windows.h>
#include <stdio.h>
#include "iostream"
using namespace std;
int Sklad = 0;
HANDLE ghSemaphore;
HANDLE c1, c2, p1, p2, p3;
unsigned long cid1, cid2, pid1, pid2, pid3;
 
void Thread_Consumer() // Клиент
{ 
    while (1)
    {
        WaitForSingleObject(ghSemaphore,INFINITE);
        while (Sklad < 1) //привязка к переменной
        {
            printf("%d Покупець очiкує\n",GetCurrentThreadId());
            Sleep(1);
        }
        Sklad--;
        printf("Зараз склад має: %d\n\n", Sklad);
        Sleep(1000);
        ReleaseSemaphore(ghSemaphore, 1,  NULL);
    }
}
void Thread_Producer() //Поставщик
{
    while (1)
    {
        WaitForSingleObject(ghSemaphore,INFINITE);
        while (Sklad > 5) // привязка к переменной
        {
            printf("%d Постачальник %d очiкує\n",GetCurrentThreadId());
            Sleep (1);
        }
        Sklad++;
        printf("Зараз склад має: %d\n\n", Sklad);
        Sleep(1000);
        ReleaseSemaphore(ghSemaphore, 1,  NULL);
    }   
}
int main( void )
{ 
    setlocale (LC_ALL, "Ukrainian");
    ghSemaphore = CreateSemaphore( NULL, 2, 5, NULL);
    c1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Consumer, NULL, 0, &cid1);
    c2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Consumer, NULL, 0, &cid2);
    p1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Producer, NULL, 0, &pid1);
    p2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Producer, NULL, 0, &pid2);
    p3 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Producer, NULL, 0, &pid3);
    while(1);
    return 0;
}
Проблема в том, что надо сделать, чтоб была привязка не к переменной склада, а через семафор. А я вот семафор не очень хорошо знаю, что б это реализировать. Как сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2013, 18:56
Ответы с готовыми решениями:

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

Синхронизация потоков на семафорах
почему не работает синхронизация потоков на семафорах? при компиляции ошибка сегментирования. На...

Классическая задача producer\consumer
Базовая задачка по потокам\семафорам. Поставщиц потребитель. Помогите вынести Buffer как отдельный...

Синхронизация потоков через Event-ы (задача producer/consumer)
Задание :Реализуйте синхронизацию для простейшего случая задачи producer/consumer (spsc – single...

6
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.05.2013, 19:31 2
Опишите задачу подробнее. Чего именно нужно достичь ?
0
2354 / 1772 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
19.05.2013, 20:29  [ТС] 3
хорошо. Вот условие задачи - есть 2 клиента(consumer - забирают продукцию) и 3 поставщика(producer - приносят продукцию). Есть склад обьемом в 6 мест. Одновременно на складе может быть 2 человека(либо 2 костюмера, 2 продюсера или 1 продюсер и 1 костюмер). Сделать моделяцию в бесконечном цикле. Если поставщик привозит продукцию, и склад заполнен - то он должен быть в очереди и ждать когда будет свободно место. Так же как и с клиентами - если склад пуст - он ждёт когда поставщик привёзёт продукцию
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.05.2013, 21:14 4
В такой постановке задача не имеет решения.
Два consumer-а зайдут на склад и будут бесконечно ждать, пока producer-ы не привезут новый товар.
А producer-ы, привезя товар, не смогут зайти на склад по условию задачи (не больше 2 человек на
складе одновременно).

Или ожидание товара не означает вход на склад ?
0
2354 / 1772 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
19.05.2013, 22:24  [ТС] 5
это один из возможных вариантов развития. Для этого надо просто перезапустить прогу. Вопрос не в том, а в другом. Можете скомпилировать мой прогу и посмотреть как она будет работать

Добавлено через 1 час 4 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
А producer-ы, привезя товар, не смогут зайти на склад по условию задачи (не больше 2 человек на
складе одновременно).

Или ожидание товара не означает вход на склад ?
ну да ))) Они становлятся в очередь, но места в складе не занимая
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.05.2013, 22:33 6
Цитата Сообщение от zewer Посмотреть сообщение
Они становлятся в очередь, но места в складе не занимая
Тогда Вам нужно разделить алгоритм на две части: первая часть реализует логику борьбы за
"ключи от склада", с постановкой ожидающих потоков в очередь, а вторая занимается охраной
самого входа на склад, допуская не более двоих посетителей за раз (семафор).
0
2354 / 1772 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
19.05.2013, 22:36  [ТС] 7
я не знаю как это сделать на Семафоре. Не на переменных, а на семафоре. На переменных у меня это сделано, в общих чертах
0
19.05.2013, 22:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2013, 22:36
Помогаю со студенческими работами здесь

Подскажите по потокам, не могу разобраться с producer/consumer
Всех приветствую, подскажите , не могу понять как всетаки правильно имплементировать...

Threads Потоки синхронизация, один producer два consumer`a и очередь
Привет. Только начал в шарпы, не говоря уже про потоки и мне тут такую задачку дали Итак дано:...

Nulls в Producer
Здравствуйте. Прошу помочь, потому как сам уже в душе не я... знаю как это разрешить while...

WildCards - producer <? extends V>
Почему producer может принимать null (и только null)? Принцип PECS мне понятен. Интересует...

то работал с программой ProShow Producer 5.0.3206?
кто работал с программой ProShow Producer 5.0.3206, как в нем создать ролик который пере запускался...

Настройка сервера MAC и запуск Podcast Producer на 10.8
Приветствую! Есть небольшой проект. На час на два, может три. Мне надо настроить MAC OS X...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru