Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Процессы и потоки windows и unix.docx
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
170.78 Кб
Скачать
    1. Листинг процедур решения задачи

DWORD WINAPI thPh(LPVOID arg)

{

const int leftFork = phNumber, rightFork = phNumber+1;

SetEvent(iterCtrl); // Этот event возвращает управление другому потоку после получения номера итератора.

while(true) {

Sleep(minWaitTime + rand()%(maxWaitTime-minWaitTime)); // Задержка

ThreadsSqn.push_back(leftFork);

// Цикл правильной последовательности входа в критическую секцию

while(true) {

if (ThreadsSqn.front() == leftFork) {

ThreadsSqn.pop_back();

break;

}

}

EnterCriticalSection(&phControl); // Разрешение критической ситуации (зависания философов) вход

if (WaitForSingleObject(alreadyUsed[leftFork], 1000) == WAIT_TIMEOUT) {

if (WaitForSingleObject(alreadyUsed[rightFork], 1000) == WAIT_TIMEOUT) {

sprintf(tmp, "Философ #%i хочет есть. Обе вилки – на месте.\n", leftFork);

richadd();

SetEvent(alreadyUsed[leftFork]);

SetEvent(alreadyUsed[rightFork]);

LeaveCriticalSection(&phControl);

pseudopause();

sprintf(tmp, "Философ #%i начал есть.\n", leftFork);

richadd();

pseudopause(); //задержка

ResetEvent(alreadyUsed[leftFork]);

ResetEvent(alreadyUsed[rightFork]);

sprintf(tmp, "Философ #%i закончил есть.\n", leftFork);

richadd();

pseudopause();

}

else if (WaitForSingleObject(alreadyUsed[rightFork], 1000) == WAIT_OBJECT_0) {

sprintf(tmp, "Философ #%i хочет есть. Правая вилка – занята!\n", leftFork);

richadd();

pseudopause();

}

}

else if (WaitForSingleObject(alreadyUsed[leftFork], 1000) == WAIT_OBJECT_0) {

sprintf(tmp, "Философ #%i хочет есть. Левая вилка – занята!\n", leftFork);

richadd();

pseudopause();

}

else if (WaitForSingleObject(alreadyUsed[rightFork], 1000) == WAIT_OBJECT_0) {

sprintf(tmp, "Философ #%i хочет есть. Правая вилка – занята!\n", leftFork);

richadd();

pseudopause();

}

else if ((WaitForSingleObject(alreadyUsed[rightFork], 1000) == WAIT_OBJECT_0) & (WaitForSingleObject(alreadyUsed[leftFork], 1000) == WAIT_OBJECT_0)) {

sprintf(tmp, "Философ #%i хочет есть. Обе вилки заняты!\n", leftFork);

richadd();

pseudopause();

}

LeaveCriticalSection(&phControl); // Разрешение критической ситуации (зависания философов) (выход)

Sleep(minWaitTime + rand()%(maxWaitTime-minWaitTime)); // Задержка

sprintf(tmp, "Философ #%i думает...\n", leftFork);

richadd();

pseudopause();

}

}

    1. Результат выполнения программы решения задачи

Результат выполнения программы показан на рисунке 5. Из данного рисунка видно, что программа корректно решает поставленную задачу.

Рисунок 5 – Результат выполнения программы.

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

  1. Взаимодействие между процессами. [Электронный ресурс].

Режим доступа: http://www.moodle.ipm.kstu.ru/mod/page/view.php?id=50

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

  1. Многозадачность в Windows. [Электронный ресурс].

Режим доступа: http://www.rsdn.ru/article/baseserv/mt.xml#E6

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

  1. Процессы и потоки в Windows. [Электронный ресурс].

Режим доступа:

http://av239.wordpress.com/2011/06/20/%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D1%8B-%D0%B8-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8-%D0%B2-windows/

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

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