реализация тупика

 
0
 
C++
ava
zaka | 18.02.2013, 12:38
Здраствуйте, мне необходимо реализовать моделирование «тупика» на примере работы с критическими секциями. Временные параметры модели определяются до начала моделирования (произвольны, но обязательно изменяемы).
вот что я нашел:

#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;
}

буду очень признателен, если поможите довести до ума)
Ответы (3)
ava
feodorv | 18.02.2013, 14:03 #
Цитата (zaka @  18.2.2013,  12:38 findReferencedText)
необходимо реализовать моделирование «тупика» на примере работы с критическими секциями

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

Цитата (zaka @  18.2.2013,  12:38 findReferencedText)
вот не полная реализация:

Боюсь, при наличии одной единственной критической секции взаимоблокировку не получить.
ava
zaka | 19.02.2013, 09:40 #
спасибо))
ava
Earnest | 19.02.2013, 13:21 #
Можно, если добавить межпоточные сообщения:
1) поток 1 занимает критическую секция и посылает сообщение потоку 2 (через Send!)
2) обработчик этого сообщения в потоке 2 начинает свою работу с попытки захвата критической секции
Дидлок гарантирован.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  Earnest ava  feodorv   zaka
advanced
Отправить