- •Курсовая работа
- •Аннотация
- •Введение
- •2.Практическая часть
- •2.1. Постановка задачи
- •2.2. Алгоритмическое решение задачи с использованием сетей Петри Представлена сеть Петри для 5 философов (Рисунок 3) ----------------
- •2.3. Решение задачи в программных кодах
- •2.3.1. Программный код приложения «Философ»
- •2.3.2 Программный код приложения «Стол»
- •2.4. Пример работы программы
- •2.5. Выводы по практической части
- •Заключение
- •Список использованных источников
2.3.2 Программный код приложения «Стол»
for(inti= 0;i<count;i++)
{
//создание процессов «Философ»
pInfo[i] = new PROCESS_INFORMATION();
Sleep(500);
bool retValue = CreateProcess(null, CommandLine,
ref pSec, ref tSec, false, 0, IntPtr.Zero, null, ref sInfo, out pInfo[i]);
}
del_Monitoring = new Del_clientFunction(Monitoring); //Запуск процесса мониторинга статусов философов
hThread = StartThread(del_Monitoring);
//Основной код для работы с философами
while (true)
{
for (int i = 0; i < Philosophers; i++)
{//пробегаем по каждому семафору состояния философа и считываем его значение
WaitForSingleObject(PhilMutex[i], 30);//захват мьютекса для доступа к состоянию
fixed (uint* adr_state = &state)
{ReleaseSemaphore(SemathorStates[i], 1, adr_state); };
WaitForSingleObject(SemathorStates[i], 1 );
//считывание состояния
switch (state)
{
case 1: // если ест
if (predstate[i] == 1) break; //если до этого ел, то //выходим из цикла
for (int j = 0; j < Philosophers / 2; j++) //ищем свободное //место
{
if (placesFlag[j] == true)
{
placesFlag[j] = false; //занимаем место
myPlace[i] =j; //философ запоминает свое место
predstate[i] = 1; //предыдущее состояние //устанавливаем "ем"
break;
}
}
break;
case 2: //если гуляет
if (predstate[i] == 2) break; //если до этого гулял, выходим из цикла
if (predstate[i] == 1) //если раньше ел
{
placesFlag[myPlace[i]] = true; //освобождаем свое место
predstate[i] = 2; //предыдущее состояние устанавливаем "гуляю"
break;
}
break;
case 3: //если состояние "голодный и гуляю"
if(predstate[i] == 3)break;
{
predstate[i] = 3; // предыдущее состояние устанавлием "голоден и гуляю"
}
break;
}
ReleaseMutex(PhilMutex[i]);
}
}
}
//уничтожение процессов
public void Terminate()
{
for (int i = 0; i < Philosophers; i++)
TerminateProcess(pInfo[i].hProcess, 0);
TerminateProcess(GetCurrentProcess(), 0);
}