Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,360
19.05.2013, 18:56     Consumer-Producer на семафорах #1
Всем добрый день. Есть программа
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;
}
Проблема в том, что надо сделать, чтоб была привязка не к переменной склада, а через семафор. А я вот семафор не очень хорошо знаю, что б это реализировать. Как сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14199 / 6214 / 986
Регистрация: 02.05.2013
Сообщений: 10,356
Завершенные тесты: 1
19.05.2013, 19:31     Consumer-Producer на семафорах #2
Опишите задачу подробнее. Чего именно нужно достичь ?
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,360
19.05.2013, 20:29  [ТС]     Consumer-Producer на семафорах #3
хорошо. Вот условие задачи - есть 2 клиента(consumer - забирают продукцию) и 3 поставщика(producer - приносят продукцию). Есть склад обьемом в 6 мест. Одновременно на складе может быть 2 человека(либо 2 костюмера, 2 продюсера или 1 продюсер и 1 костюмер). Сделать моделяцию в бесконечном цикле. Если поставщик привозит продукцию, и склад заполнен - то он должен быть в очереди и ждать когда будет свободно место. Так же как и с клиентами - если склад пуст - он ждёт когда поставщик привёзёт продукцию
Убежденный
Системный программист
 Аватар для Убежденный
14199 / 6214 / 986
Регистрация: 02.05.2013
Сообщений: 10,356
Завершенные тесты: 1
19.05.2013, 21:14     Consumer-Producer на семафорах #4
В такой постановке задача не имеет решения.
Два consumer-а зайдут на склад и будут бесконечно ждать, пока producer-ы не привезут новый товар.
А producer-ы, привезя товар, не смогут зайти на склад по условию задачи (не больше 2 человек на
складе одновременно).

Или ожидание товара не означает вход на склад ?
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,360
19.05.2013, 22:24  [ТС]     Consumer-Producer на семафорах #5
это один из возможных вариантов развития. Для этого надо просто перезапустить прогу. Вопрос не в том, а в другом. Можете скомпилировать мой прогу и посмотреть как она будет работать

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

Или ожидание товара не означает вход на склад ?
ну да ))) Они становлятся в очередь, но места в складе не занимая
Убежденный
Системный программист
 Аватар для Убежденный
14199 / 6214 / 986
Регистрация: 02.05.2013
Сообщений: 10,356
Завершенные тесты: 1
19.05.2013, 22:33     Consumer-Producer на семафорах #6
Цитата Сообщение от zewer Посмотреть сообщение
Они становлятся в очередь, но места в складе не занимая
Тогда Вам нужно разделить алгоритм на две части: первая часть реализует логику борьбы за
"ключи от склада", с постановкой ожидающих потоков в очередь, а вторая занимается охраной
самого входа на склад, допуская не более двоих посетителей за раз (семафор).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2013, 22:36     Consumer-Producer на семафорах
Еще ссылки по теме:

потоки на семафорах C++
MS Word Активация Office 16 Consumer Preview

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

Или воспользуйтесь поиском по форуму:
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,360
19.05.2013, 22:36  [ТС]     Consumer-Producer на семафорах #7
я не знаю как это сделать на Семафоре. Не на переменных, а на семафоре. На переменных у меня это сделано, в общих чертах
Yandex
Объявления
19.05.2013, 22:36     Consumer-Producer на семафорах
Ответ Создать тему
Опции темы

Текущее время: 23:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru