Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация тупика 
:(
    Опции темы
zaka
Дата 18.2.2013, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 2.12.2012

Репутация: нет
Всего: нет



Здраствуйте, мне необходимо реализовать моделирование «тупика» на примере работы с критическими секциями. Временные параметры модели определяются до начала моделирования (произвольны, но обязательно изменяемы).
вот что я нашел:
Код

#include <iostream>
#include <Windows.h>
#include <process.h>
#include <queue>
#include <time.h>
#define N 256
//e - число пустых буферов и f - число заполненных буферов
//b - двоичный семафор, используемый для обеспечения взаимного исключения
int e = N, f = 0, b = 1;

void Writer ()
{
   while(1)
      {
PrepareNextRecord();      /* подготовка новой записи   */

P(e);                            /* Уменьшить число свободных буферов, если они есть */
                                  /* в противном случае - ждать, пока они освободятся */

P(b);                           /* Вход в критическую секцию  */

AddToBuffer();             /* Добавить новую запись в буфер */

V(b);                         /* Выход из критической секции   */

V(f);                        /* Увеличить число занятых буферов */

 }
}

void Reader ()
{
  while(1)
   {
P(f);                        /* Уменьшить число занятых буферов, если они есть */
                              /* в противном случае ждать, пока они появятся    */
P(b);                       /* Вход в критическую секцию                      */
GetFromBuffer();       /* Взять запись из буфера                         */
V(b);                      /* Выход из критической секции                    */
V(e);                      /* Увеличить число свободных буферов              */
ProcessRecord();      /* Обработать запись                              */
 }
}

Если переставить местами операции P(e) и P(b) в программе, то при некотором стечении обстоятельств эти два процесса могут взаимно заблокировать друг друга. 

вот не полная реализация:
Код

#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;

CRITICAL_SECTION cs;
HANDLE hThr;
unsigned long uThrID;
char ch;
#define N 256
int e = N, f = 0, b = 1; 
 
void Writer( void* pParams )
{
    int i=100;
    while (i--)
    {
        EnterCriticalSection( &cs );
        ch = 'a';
        cout<<ch;
        LeaveCriticalSection( &cs );
    }
}
 
int main( void )
{
    int i=100;
    char x;
    InitializeCriticalSection( &cs );
    hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Writer,NULL,0,&uThrID);
    while(i--)
    {
        EnterCriticalSection( &cs );
        ch = 'b';
        cout<<ch;
        LeaveCriticalSection( &cs );
        
}
     system("PAUSE");
             return 0;
}

буду очень признателен, если поможите довести до ума)

Это сообщение отредактировал(а) GremlinProg - 18.2.2013, 11:54
PM MAIL   Вверх
feodorv
Дата 18.2.2013, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(zaka @  18.2.2013,  12:38 Найти цитируемый пост)
необходимо реализовать моделирование «тупика» на примере работы с критическими секциями

Подобный пример описан в книге Джеффри Рихтера "Windows для профессионалов". Для издания "Питер. Русская редакция" 2003 года пример будет в главе 8, стр. 205 (одновременный доступ к нескольким ресурсам).

Цитата(zaka @  18.2.2013,  12:38 Найти цитируемый пост)
вот не полная реализация:

Боюсь, при наличии одной единственной критической секции взаимоблокировку не получить.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
zaka
Дата 19.2.2013, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 2.12.2012

Репутация: нет
Всего: нет



спасибо))
PM MAIL   Вверх
Earnest
Дата 19.2.2013, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Можно, если добавить межпоточные сообщения:
1) поток 1 занимает критическую секция и посылает сообщение потоку 2 (через Send!)
2) обработчик этого сообщения в потоке 2 начинает свою работу с попытки захвата критической секции
Дидлок гарантирован.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.