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

Задача "Производители-Потребители", реализация с помощью Events и циклического буфера - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ альтернатива Turbo Cи для Win 7 (x64) http://www.cyberforum.ru/cpp/thread371065.html
Всем привет. У меня такой вопрос: есть ли современная альтернатива Turbo С под Windows ? такая я же не большая по объему. Чтоб Visual C++ не ставить.
C++ Подскажите! Привет! Учился на программиста в универе, окончил в 2005 году. После универа ушел в 1С и писал только на 1С, другие языки не использовал. В универе изучал Pascal, C (в 2001 году), Delphi, Fortran. Паскаль и С изучал в ДОС-среде. После 6 лет возникло желание написать простенькую игру 2D на С. Идея есть, алгоритм смогу реализовать. Не следил за развитием платформ для программирования на С. Толком... http://www.cyberforum.ru/cpp/thread370891.html
Программно создать Базу Данных C++
Здравствуйте! Я пытаюсь освоить работу с базами данных через ODBC. Но совершенно неясно как программно создать базу данных через этот интерфейс. Подскажите полалуйста какой-нибудь простейший пример с программным созданием базы данных.
помогите найти подходящую оболочку под C++ C++
Привет всем ! Проконсультируйте пожалуйста меня по поводу оболочек под C++ Дело в том, что я знаком с MetaTrader4 и с оболочкой под язык MQL4 (программа называется Metaeditor.exe), в которой я недавно закончил писать Тестера для подборки параметров к торговому роботу, - дело здесь в том, что данный тестер работает медленно (как мне кажется), и с помощью специального алгоритма расчета...
C++ Motion Detector (OpenCV) http://www.cyberforum.ru/cpp/thread370648.html
Всем привет! =) Только начал разбираться с OpenCV. Хочу попробовать камеру распознавать движение. Детектор движения должен реализоваться на C++ при помощи библиотеки OpenCV. Но возникла одна проблемка. Вот, собственно код: #include "v_motion_detector.h" #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/video/tracking.hpp> const double VMotionDetector::MOTION_THRESHOLD = 10;...
C++ Задача обедающих философов при помощи событий (events) Здравствуйте. Очень нужна помощь с сабжем. Самостоятельно ничего не вышло - не пойму как это вообще выглядеть должно. Посему, кому не трудно, поделитесь кодом. Добавлено через 23 часа 43 минуты Ну пожалуйста :( Добавлено через 6 часов 36 минут Попытался реализовать так, как понимаю. Ошибок нет, но работает как-то... не так. Помогите исправить недокод, пожалуйста. #include "stdafx.h" подробнее

Показать сообщение отдельно
sergeyotro
 Аватар для sergeyotro
0 / 0 / 0
Регистрация: 08.10.2011
Сообщений: 13
23.10.2011, 14:41     Задача "Производители-Потребители", реализация с помощью Events и циклического буфера
Доброго времени суток.

Написал программу для решения сабжевой задачи, с условиями 1 производитель, 1 потребитель.
Программа работает, потоки синхронизируются, тупиков не возникает.

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

В реализации этого условия и прошу помочь. Улучшения кода по первому условию так же приветствуется.

Ниже - текст программы с 1 производителем и 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
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
#include <iostream>
#include <conio.h>
#include <windows.h>
 
using namespace std;
 
unsigned long uThrProdID1, uThrConsID;
 
HANDLE hEventWrite, hEventRead;
HANDLE hThrProd1, hThrCons;
void ProducerThread(char name[11]);
void ConsumerThread(void *pParams);
 
#define SIZE_BUF 25
 
int cycleBuf[SIZE_BUF];
int tail = 0;
int head = 0;
int count = 0;
 
void FlushBuf(void);
void PutChar(int sym);
int GetChar(void);
 
int main()
{
    FlushBuf();
 
    hEventWrite = CreateEvent(NULL, FALSE, FALSE, NULL);
    hEventRead = CreateEvent(NULL, FALSE, TRUE, NULL);
 
    hThrProd1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ProducerThread, "Producer 1", 0, &uThrProdID1);
 
    hThrCons = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ConsumerThread, NULL, 0, &uThrConsID);
 
    getch();
    return 0;
}
 
void ProducerThread(char name[11])
{
    WaitForSingleObject(hEventRead, INFINITE);
    while(1)
    {
        Sleep(rand()%500);
 
        while (count < SIZE_BUF)
            PutChar(rand());
 
        cout <<  name << ": There are " << count << " symbols in buf" << endl << endl;
        SetEvent(hEventWrite);
    }
}
 
void ConsumerThread(void *pParams)
{
    WaitForSingleObject(hEventWrite, INFINITE);
    while(1)
    {
        Sleep(rand()%50);
 
        if (count == 0)
        {
            SetEvent(hEventRead);
            WaitForSingleObject(hEventWrite, INFINITE);
        }
 
        GetChar();
        cout << "Consumer: There are " << count << " symbols in buf now." << endl << endl;
    }
}
 
void FlushBuf(void)
{
    tail = 0;
    head = 0;
    count = 0;
}
 
void PutChar(int sym)
{
    if (count < SIZE_BUF)
    {
        cycleBuf[tail] = sym;
        count++;
        tail++;
        if (tail == SIZE_BUF) tail = 0;
    }
}
 
int GetChar(void)
{
    int sym = 0;
    if (count > 0)
    {
        sym = cycleBuf[head];
        count--;
        head++;
        if (head == SIZE_BUF) head = 0;
    }
    return sym;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 09:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru