Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 18
1

Критическая секция

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

Очень срочно,помогите пожалуйста,на Сях,реализовать работу бензоколонки - бензин 80,92,95,98,Дизель - разлив бензина автомобилям через критическую секцию.Учесть въезд - выезд автомобилей на заправку.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2012, 15:37
Ответы с готовыми решениями:

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

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

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

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

12
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
06.01.2012, 16:18 2
Модель бензоколонки? Звучит так, будто нужно софт для реальной написать.
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 18
06.01.2012, 16:21  [ТС] 3
нет, совершенно нет просто как пример реализации критической секции
0
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,234
07.01.2012, 08:38 4
а где код который надо править?
0
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;
}
0
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,234
07.01.2012, 13:23 6
1. Если TryEnterCriticalSection() возвращает не ноль, то нет надобности вызывать EnterCriticalSection() (msdn)
(строки 28 и 32 не нужны)
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 18
08.01.2012, 01:35  [ТС] 7
а еще в чем загвоздка?объясните пожалуйста так как с такими задачами никогда не сталкивался
0
Формучанин
362 / 293 / 41
Регистрация: 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 / 0
Регистрация: 07.01.2011
Сообщений: 18
08.01.2012, 12:45  [ТС] 9
так алгоритм же не мой, я и сам ничего в этом не понимаю, просто взял похожий и думал переделать

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

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

Критическая секция
такая задача. есть глобальный указатель на структуру. в main -е динамически выделяю память под...

Критическая секция
Требуется применить критическую секцию для процессов через разделяемую память. Ниже привел участок...


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

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

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