Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг процедур, обеспечивающих решение задачи






/* Главная процедура программы «Философ». Существует еще программа «Стол» (или «Повар»), которая «подзывает философов» (запускает процессы с передачей параметров запуска). Подход, использованный для решения данной задачи, подробно описан в [2] на странице 206.*/

int main(int argc, char* argv[])

{

randomize();

Sleep(atoi(argv[1])); // философ подходит к столу не сразу

int Number=atoi(argv[2]); // номер данного философа

 

/* установка именованного соединения со «столом» (необходимо для передачи текущего состояния философа) */

while (1)

{

hPipe = CreateFile (lpszPipename,

GENERIC_READ |

GENERIC_WRITE,

FILE_SHARE_READ,

NULL,

OPEN_EXISTING,

0,

NULL);

if (hPipe! = INVALID_HANDLE_VALUE) break;

if (GetLastError()! = ERROR_PIPE_BUSY) return 1;

if (! WaitNamedPipe(lpszPipename, 20000)) return 1;

}

/* передача столу своего номера (функция (обработчик подключения «стола») не имеет никакого представления о том, какой философ к нему подошёл) */

MailToServer(Number);

HANDLE Mut, Crit;

/* номер левого (правого) соседа для нашего философа */

int LEFT=(Number+N-1)%N,

RIGHT=(Number+1)%N;

AnsiString left=" Mut" +IntToStr(LEFT),

right=" Mut" +IntToStr(RIGHT),

im=" Mut" +IntToStr(Number),

crit=" Crit";

/* создаётся мьютекс взаимного исключения входа в критическую

область */

Crit = CreateMutex(NULL, false, crit.c_str());

MailToServer(5); // философ подходит к столу

Sleep(random(2001)+3000);

MailToServer(4); // философ думает

Sleep(random(2001)+3000);

MailToServer(3); // философ хочет есть

bool flag=false;

while (! flag)

{

/* ожидание входа в критическую область */

WaitForSingleObject(Crit, INFINITE);

HANDLE Left, Right;

/* проверка состояния левого и правого соседей */

Left=OpenMutex(MUTEX_ALL_ACCESS, 0, left.c_str());

Right=OpenMutex(MUTEX_ALL_ACCESS, 0, right.c_str());

if (! Left& &! Right) // если соседи не едят

{

flag=true;

Mut = CreateMutex(NULL, false, im.c_str());

MailToServer(2); // философ приступает к приёму пищи

ReleaseMutex(Crit); // выход из критической области

}

else

{

ReleaseMutex(Crit);

CloseHandle(Left);

CloseHandle(Right);

}

}

 

Sleep(random(2001)+3000);

CloseHandle(Mut); // прекращение приёма пищи

MailToServer(1); // наелся и уснул

Sleep(random(2001)+3000);

MailToServer(0); // завершение функционирования

CloseHandle(hPipe);

return 0;

}

 

Список использованных источников

1. Котов В.Е. Сети Петри. – М.: Наука. Главная редакция физико-математической литературы. 1984. – 160 с.

2. Таненбаум Э.Современные операционные системы. 3-е изд. – СПб.: Питер, 2010. – 1120 с.

3. Таненбаум Э.Операционные системы. Разработка и реализация / Таненбаум Э., Вудхалл А. – СПб.: Питер, 2007. – 704 с.

4. Википедия [Электронный ресурс].

Режим доступа: https://ru.wikipedia.org/wiki/Состояние_гонки

Дата доступа: 08.12.2012






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.