Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг процедур, обеспечивающих решение задачи ⇐ ПредыдущаяСтр 3 из 3
/* Главная процедура программы «Философ». Существует еще программа «Стол» (или «Повар»), которая «подзывает философов» (запускает процессы с передачей параметров запуска). Подход, использованный для решения данной задачи, подробно описан в [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
|