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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
Димонез
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 18
#1

Критическая секция - C++

06.01.2012, 15:37. Просмотров 2249. Ответов 12
Метки нет (Все метки)

Очень срочно,помогите пожалуйста,на Сях,реализовать работу бензоколонки - бензин 80,92,95,98,Дизель - разлив бензина автомобилям через критическую секцию.Учесть въезд - выезд автомобилей на заправку.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2012, 15:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Критическая секция (C++):

Критическая секция - C++
Есть процесс в нем создается 2 потока, проблема в том, что когда один из потоков находится в критической секции и если его уничтожить или...

Секция resource - C++
подскажите. вот у меня есть в файлах ексешных секция .rsrc только там данные размещены не последовательно.. т.е. между данными есть...

Не работает критическая секция - C++ Builder
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include...

Как работают объекты синхронизации (критическая секция, мьютекс, событие, семафор)? - C++ Builder
Помогите пожалуйста разобраться!Как должны работать объекты синхронизации такие как:критическая секция,мьютекс,событие и семафор. Я...

Секция кода в исполняемых файлах - Visual C++
Добрый день всем! Кто хорошо знает pe-формат и работал с ним, можете подсказать как правильно выделить чистый код для модификации,...

Критическая ошибка при запуске установки - Visual C++
Вообщем при попытке установки Visual C++ любой версии кроме 2008 выдает сразу критическую ошибку. Файлы рабочие (проверенные на других...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1753 / 1096 / 72
Регистрация: 13.09.2011
Сообщений: 3,129
06.01.2012, 16:18 #2
Модель бензоколонки? Звучит так, будто нужно софт для реальной написать.
Димонез
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 18
06.01.2012, 16:21  [ТС] #3
нет, совершенно нет просто как пример реализации критической секции
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
07.01.2012, 08:38 #4
а где код который надо править?
Димонез
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 18
07.01.2012, 11:51  [ТС] #5
ну допустим вот, и то не особо уверен в правильности
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
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <time.h>
#include <conio.h>
#define MAX_AVTO 5
using namespace std;
 
class CKolonka;
CRITICAL_SECTION forkCriticalSection[MAX_AVTO];
HANDLE hPhilThread[MAX_AVTO];
DWORD uThreadIDs[MAX_AVTO];
CKolonka* pkol[MAX_AVTO];
 
class CKolonka{
public:
        CKolonka() { iHungry=0; }
        int iHungry;
        int iNum;
        
        bool eat()
        {
                if( (pkol[(iNum+1)%5]->iHungry) <= iHungry && (pkol[(iNum+4)%5]->iHungry) <= iHungry )   
                {
                        if (TryEnterCriticalSection(&forkCriticalSection[iNum]))
                        {
                                EnterCriticalSection(&forkCriticalSection[iNum]);
                                cout << "Kolonka  " << iNum  << ": Ya zapravlyayu mashinu nomer " << iNum << endl;
                                if (TryEnterCriticalSection(&forkCriticalSection[(iNum+1)%5]))
                                {
                                        EnterCriticalSection(&forkCriticalSection[(iNum+1)%5]);
                                        cout << "Kolonka  " << iNum << ": Ya zapravlyayu mashinu nomer " << ((iNum + 1)%5) << endl;
                                        cout << "Kolonka  " << iNum << ": Ya zapravlyayus " << endl;
 
                                        Sleep(300);
 
                                        LeaveCriticalSection(&forkCriticalSection[(iNum+1)%5]);
                                        cout << "Kolonka  " << iNum  << ": Ya zapravil mashinu nomer " << ((iNum+1)%5) << endl;
                                        LeaveCriticalSection(&forkCriticalSection[iNum]);
                                        cout << "Kolonka  " << iNum  << ": Ya zapravil mashinu nomer " << iNum+1 << endl;
                                        return true;
                                } 
                                else 
                                {
                                        cout << "Kolonka " << iNum << ": Ya ne mogu zapravit mashinu nomer " << ((iNum + 1)%5) << endl;
                                        LeaveCriticalSection(&forkCriticalSection[iNum]);
                                        return false;
                                }
                        }
                }
        };
};
 
 
void body(LPVOID lpParam)
{
        CKolonka* iFilos;
        iFilos = (CKolonka*)lpParam;
        srand(time(NULL));
        while (1)
        {
                if (!(iFilos->eat()))
                {
                        (iFilos->iHungry)++;
                        
                        Sleep(rand()%3000);
                }
                else
                {
                        iFilos->iHungry = 0;
                        
                        Sleep(rand()%3000);
                }
        }
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
        srand(time(NULL));
 
        for ( int i = 0; i < 5; i++ )
        {
                InitializeCriticalSection( &forkCriticalSection[i] );
                pkol[i] = new CKolonka;
        }
        
        for ( int i = 0; i < 5; i++ )
        {
                pkol[i]->iNum = i;
                hPhilThread[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)body,pkol[i],0,&uThreadIDs[i]);
        }
 
        _getch();
        for ( int i = 0; i < 5; i++ )
        CloseHandle(hPhilThread[i]);
        return 0;
}
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
07.01.2012, 13:23 #6
1. Если TryEnterCriticalSection() возвращает не ноль, то нет надобности вызывать EnterCriticalSection() (msdn)
(строки 28 и 32 не нужны)
Димонез
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 18
08.01.2012, 01:35  [ТС] #7
а еще в чем загвоздка?объясните пожалуйста так как с такими задачами никогда не сталкивался
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
08.01.2012, 08:35 #8
C++
1
if( (pkol[(iNum+1)%5]->iHungry) <= iHungry && (pkol[(iNum+4)%5]->iHungry) <= iHungry )
==(при условии что iNum принимает значение от 0 до 4 включительно)
C++
1
2
3
4
5
int next;int prev;
next=iNum+1;prev=iNum-1;
if (next > 4) next=0;
if (prev < 0) prev=4;
if( (pkol[next]->iHungry) <= iHungry && (pkol[prev]->iHungry) <= iHungry )
зачем сравнивать параметр iHungry своей нити, с параметром iHungry других нитей?


C++
1
cout << "Kolonka  " << iNum  << ": Ya zapravlyayu mashinu nomer " << iNum << endl;
почему номер колонки==номеру машины?


C++
1
2
3
4
5
6
  if (TryEnterCriticalSection(&forkCriticalSection[iNum]))
                        {
                               // EnterCriticalSection(&forkCriticalSection[iNum]);
                                cout << "Kolonka  " << iNum  << ": Ya zapravlyayu mashinu nomer " << iNum << endl;
                                if (TryEnterCriticalSection(&forkCriticalSection[(iNum+1)%5]))
//...
Судя по алгоритму, каждая нить занимает свою секцию и следующую:
колонкаиспользует секции
00, 1
11, 2
22, 3
33, 4
44, 0
какой в этом смысл, я что то не догоняю?
Димонез
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 18
08.01.2012, 12:45  [ТС] #9
так алгоритм же не мой, я и сам ничего в этом не понимаю, просто взял похожий и думал переделать

Добавлено через 5 минут
вообщем колонок может быть сколь угодно, машин тоже, к тому же они через определенный период времени подъезжают и подъезжают к свободным колонкам
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
08.01.2012, 12:47 #10
ну тогда вопросы лучше адресовать автору кода).
Моё мнение -лучше написать с нуля.
Код из первого поста слишком странный чтобы его понять как "модель бензоколонки".
Димонез
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 18
08.01.2012, 13:50  [ТС] #11
в том то и дело, с нуля никак не могу, ну не пойму я эти критические секции хоть вы тресните, вот и обратился за помощью
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
08.01.2012, 14:29 #12
Что конкретно не ясно?
Информация для ознакомления:
Критическая секция
msdn:
InitializeCriticalSection()
EnterCriticalSection()
LeaveCriticalSection()
DeleteCriticalSection()
Димонез
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 18
08.01.2012, 18:51  [ТС] #13
неясно как написать программу целиком))извините, но на сях я нуб а необходимо именно на них)а уж с критической секцией так вообще ни разу не сталкивался
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 18:51
Привет! Вот еще темы с ответами:

Критическая секция - Delphi
Привет! Вот я уже как дня 2 маюсь с критической секцией CriticalSection.Enter; CS.Enter; Inc(Acc); if Acc &lt;...

Критическая секция - C++ WinAPI
Требуется применить критическую секцию для процессов через разделяемую память. Ниже привел участок кода, который это делает при условии...

Критическая секция - C#
Добрый день. Подскажите пожалуйста: в коде ниже если один поток пишет в file1.txt, другой не сможет начать запись в file2.txt, если...

Критическая секция - C++
Ребята помогите пожалуйста, надо сделать 5 потоков с помощью критической секции, незнаю как!!! пытался что-то сделать но ничего путного не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.01.2012, 18:51
Ответ Создать тему
Опции темы

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