Здраствуйте, мне необходимо реализовать моделирование «тупика» на примере работы с критическими секциями. Временные параметры модели определяются до начала моделирования (произвольны, но обязательно изменяемы). вот что я нашел:
| Код | #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; }
|
буду очень признателен, если поможите довести до ума) |