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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.78
novi4ek100500
Сообщений: n/a
#1

Производитель потребитель - C++

09.12.2010, 21:40. Просмотров 3267. Ответов 3
Метки нет (Все метки)

Задание:
написать программу, в которой реализуется следующее: запись рандомного числа в массив, получение данного числа из массива и запись на экран. Сделать надо отдельные функции производитель и потребитель.Работать они должны одновременно. Использовать семафоры для доступа в критические секции. Язык Си и рандом из С++.
есть ли тут ошибки? как запустить две функции одновременно?

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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream.h>
const int N = 100;  // razmer bufera
typedef int semaphore; // semafor celochislenniy
semaphore mutex = 1;   // vzaimoisklucheniya dlja kriticheskoy situacii
semaphore empty = N;   // semafor empty
semaphore full = 0;    // semafor full
int buf[1];
void producer() //proizvoditel
{
    int item;
    while(empty)
    {
    randomize();
    item = random (100);  // generiruem proizvolnoe chislo ot 1 do 99
    empty--; //umenshaem semafor empty
    mutex--; //umenshaem semafor mutex
    buf[empty] = item; // pomeshaem chilo v bufer
    mutex++; //uvelichivaem snachala mutex
    full++;  //zatem full
    }
    }
 
 
void consumer() //potrebitel
{
    int item;
    int a=0;
    while(full)
    {
    full--; //umenshem full
    mutex--; //zatem mutex
    item = buf[empty]; // zabiraem informaciju iz bufera
    mutex++; //uvelichivaem mutex
    empty++; //uvelichivaem empty
    a=item;
    printf ("%d", a);
    
    }
  
    }
 
void main ()
{
clrscr();
producer();
consumer();
getch();
}
 Комментарий модератора 
Используйте теги форматирования кода.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2010, 21:40     Производитель потребитель
Посмотрите здесь:

Производитель видеокарт ZOTAC
Пробежаться по всем значениям поля Потребитель и занести каждое значение в DBComboBox Delphi БД
Потребитель- производитель C++ Linux
Производитель RAM
Мощность, котокую получит от подстанции потребитель
C# Производитель-Потребитель c собственным Монитором на мьютексах
Потребитель израсходовал n кВт/ч. Подсчитать плату C++
C++ C++11 thread производитель-потребитель
C++ Текстовый редактор: наименование, фирма-производитель, количество окон, количество шрифтов, стоимость
C++ Разработать класс "Product" с полями Наименование, Производитель, Цена, Срок хранения, Дата выпуска
C++ Разработать класс "Машина" с полями: марка, страна-производитель, максимальная скорость, объём двигателя
Паттерн и задача Производитель/Потребитель (Produser/Consumer)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Crudelis
Шаровик затейник
670 / 412 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
10.12.2010, 02:03     Производитель потребитель #2
генерировать случайны числа нужно так:
C++
1
2
srand((unsigned)time(NULL));
item=rand()%100;
нужно подключить
C++
1
#include<ctime>
Добавлено через 1 минуту
на счёт того чтоб работали две функции одновременно вам нужно создавать поток и в нем запускать функцию, если вы знаете потоки то это не составит труда, если нет то видимо вы что то напутали с заданием, другого варианта как запустить 2 функции одновременно я не знаю
novi4ek100500
Сообщений: n/a
10.12.2010, 07:16     Производитель потребитель #3
спасибо!с заданием я не напутал. два потока запустил. говорят у меня косяк с семафорами и что mutex-- тут ничего не ограничивает
pepsikat
292 / 12 / 2
Регистрация: 21.12.2010
Сообщений: 295
22.12.2010, 23:31     Производитель потребитель #4
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//---------------------------------------------------------------------------
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
 
#define BufferSize 2
#define Producers 5
#define Consumers 5
 
int Buffer[BufferSize];
bool Trans;
HANDLE hFull, hEmpty, hMutex;
 
DWORD WINAPI Producer(void * pValue)
{
 int SleepInterval, Value, i, Count, Written;
 Trans = true;
 Count = 15;
 while (Count>0)
     {
      Count--;
      Value = random(10)+1;
      WaitForSingleObject(hEmpty, INFINITE);
      WaitForSingleObject(hMutex, INFINITE);
 
      if (Buffer[BufferSize-1]!=0)
       printf("Producer: %d | Value %d losted\n", Value, Buffer[BufferSize-1]);
      else
       printf("Producer: %d\n", Value);
      for (i=BufferSize-2; i >= 0; i--)
       Buffer[i+1]=Buffer[i];
      Buffer[0]=Value;
 
      ReleaseSemaphore(hMutex, 1, NULL);
      ReleaseSemaphore(hFull, 1, NULL);
      SleepInterval=random(2000)+2000;
      Sleep(SleepInterval);
      }
 return 0;
}
 
DWORD WINAPI Consumer(void * pValue)
{
int SleepInterval, Value, i, Count, Written;
while(Trans)
  {
  Written=0;
  WaitForSingleObject(hFull, INFINITE);
  WaitForSingleObject(hMutex, INFINITE);
  for (i=BufferSize-1; i>=0; i--)
    if (Buffer[i]!=0)
      {
      Written=i;
      break;
      }
  Value=Buffer[Written];
  Sleep(random(21));
  Buffer[Written]=0;
  if (Value==0)
    printf("\t\t\t\tConsumer: %d | The value is wrong!\n", Value);
  else
    printf("\t\t\t\tConsumer: %d\n", Value);
 
  ReleaseSemaphore(hMutex, 1, NULL);
  ReleaseSemaphore(hEmpty, 1, NULL);
  SleepInterval=random(2000)+1000;
  Sleep(SleepInterval);
  }
}
 
int main(void)
{
HANDLE hThreads[Producers+Consumers];
DWORD ThreadId;
int i;
randomize();
hMutex=CreateSemaphore(NULL, 1, 1,"Mutex");
hFull=CreateSemaphore(NULL, 0, BufferSize ,"Full");
hEmpty=CreateSemaphore(NULL, BufferSize, BufferSize,"Empty");
 
for (i=0; i<BufferSize; i++) Buffer[i]=0;
 
for (i=0; i<Producers; i++)
  hThreads[i]=CreateThread(0, 0, Producer, 0,0, &ThreadId);
 
for (i=Producers; i<Producers+Consumers; i++)
  hThreads[i]=CreateThread(0, 0, Consumer, 0, 0, &ThreadId);
 
WaitForMultipleObjects(Producers, hThreads, true, INFINITE);
 
Trans=false;
 
WaitForMultipleObjects(Producers+Consumers, hThreads, true, INFINITE);
 
for (i=0; i<Producers+Consumers; i++)
  CloseHandle(hThreads[i]);
  CloseHandle(hMutex);
  CloseHandle(hFull);
  CloseHandle(hEmpty);
 
getch();
return 0;
}
 
//---------------------------------------------------------------------------
 Комментарий модератора 
Используйте теги форматирования кода.
Yandex
Объявления
22.12.2010, 23:31     Производитель потребитель
Ответ Создать тему
Опции темы

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