С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zewer
1366 / 1055 / 111
Регистрация: 07.01.2011
Сообщений: 6,925
#1

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

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

Всем добрый день. Есть программа
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2013, 18:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Consumer-Producer на семафорах (C++):

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

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

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

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

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

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

6
Убежденный
Ушел с форума
Эксперт С++
15708 / 7219 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
19.05.2013, 19:31 #2
Опишите задачу подробнее. Чего именно нужно достичь ?
0
zewer
1366 / 1055 / 111
Регистрация: 07.01.2011
Сообщений: 6,925
19.05.2013, 20:29  [ТС] #3
хорошо. Вот условие задачи - есть 2 клиента(consumer - забирают продукцию) и 3 поставщика(producer - приносят продукцию). Есть склад обьемом в 6 мест. Одновременно на складе может быть 2 человека(либо 2 костюмера, 2 продюсера или 1 продюсер и 1 костюмер). Сделать моделяцию в бесконечном цикле. Если поставщик привозит продукцию, и склад заполнен - то он должен быть в очереди и ждать когда будет свободно место. Так же как и с клиентами - если склад пуст - он ждёт когда поставщик привёзёт продукцию
0
Убежденный
Ушел с форума
Эксперт С++
15708 / 7219 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
19.05.2013, 21:14 #4
В такой постановке задача не имеет решения.
Два consumer-а зайдут на склад и будут бесконечно ждать, пока producer-ы не привезут новый товар.
А producer-ы, привезя товар, не смогут зайти на склад по условию задачи (не больше 2 человек на
складе одновременно).

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

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

Или ожидание товара не означает вход на склад ?
ну да ))) Они становлятся в очередь, но места в складе не занимая
0
Убежденный
Ушел с форума
Эксперт С++
15708 / 7219 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
19.05.2013, 22:33 #6
Цитата Сообщение от zewer Посмотреть сообщение
Они становлятся в очередь, но места в складе не занимая
Тогда Вам нужно разделить алгоритм на две части: первая часть реализует логику борьбы за
"ключи от склада", с постановкой ожидающих потоков в очередь, а вторая занимается охраной
самого входа на склад, допуская не более двоих посетителей за раз (семафор).
0
zewer
1366 / 1055 / 111
Регистрация: 07.01.2011
Сообщений: 6,925
19.05.2013, 22:36  [ТС] #7
я не знаю как это сделать на Семафоре. Не на переменных, а на семафоре. На переменных у меня это сделано, в общих чертах
0
19.05.2013, 22:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2013, 22:36
Привет! Вот еще темы с ответами:

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

Windows 8 Consumer Preview vs VPN - Windows 8, 8.1
Всем привет.Столкнулся с такой проблемой.Вообщем установил Windows 8 Consumer Preview и решил настроить интернет настраивал как на 7 как...

Вышла Windows 8 Consumer Preview - Windows 8, 8.1
Почти час назад Windows 8 Consumer Preview стала доступна для загрузки. Скачать образ можно здесь Windows 8 Consumer Preview ISO...

Активация Office 16 Consumer Preview - MS Word
Как нелицензионным способом можно активировать?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.