Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №4 Вариант 10

.doc
Скачиваний:
17
Добавлен:
20.06.2014
Размер:
111.1 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №4

«Реализация многопоточных приложений с синхронизацией потоков»

по дисциплине

«Операционные системы»

Студент

Филатов А.А.

подпись, дата

фамилия, инициалы

Группа

АС-09

Принял

Журавлева М.Г.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2011

  1. Задание

Решить задачу “обедающих философов” на основе потоков Windows.

ФОРМУЛИРОВКА ЗАДАЧИ

За круглым столом расставлены стулья, каждый из которых занимает определенный философ (в первой формулировке Э. Дейкстры число философов равнялось пяти). В центре стола – большое блюдо спагетти, а на столе лежат пять вилок — каждая между двумя соседними тарелками. Каждый философ находится только в двух состояниях — либо он размышляет, либо ест спагетти. Начать думать после еды философу ничто не мешает. Но чтобы начать есть, необходимо выполнить ряд условий. Предполагается, что любой философ, прежде чем начать есть, должен положить из общего блюда спагетти себе в тарелку. Для этого он одновременно должен держать в левой и правой руках по вилке, набрать спагетти в тарелку с их помощью и, не выпуская вилок из рук, начать есть. Закончив еду, философ кладет вилки слева и справа от своей тарелки и опять начинает размышлять до тех пор, пока снова проголодается.

Листинг программы

#include <windows.h>

#include <iostream>

#include <conio.h>

#include <locale.h>

#define Count 5

#define lpFileShareName "$ShareMap$"

struct RetArr

{

char MutexName[Count+1][15];

}* lpFileMap;

DWORD WINAPI Function( LPVOID lpParam )

{

int number = (int)lpParam;

HANDLE hFileMapping = OpenFileMappingA(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, lpFileShareName);

RetArr* lpFileMap = (RetArr*)MapViewOfFile( hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);

HANDLE Mutex0 = OpenMutexA(MUTEX_ALL_ACCESS, FALSE, lpFileMap->MutexName[number]);

HANDLE Mutex1 = OpenMutexA(MUTEX_ALL_ACCESS, FALSE, lpFileMap->MutexName[(number+1)%Count]);

HANDLE MutexN = OpenMutexA(MUTEX_ALL_ACCESS, FALSE, lpFileMap->MutexName[Count]);

while(true)

{

WaitForSingleObject(MutexN, INFINITE);

for(int k=0;k<number;k++)

printf("\t\t");

printf("голодный\n");

ReleaseMutex(MutexN);

HANDLE Mutex[2]={Mutex0,Mutex1};

while(true)

{

WaitForSingleObject(Mutex0, INFINITE);

DWORD wait = WaitForSingleObject(Mutex1, 100);

if(wait == WAIT_TIMEOUT)

{

ReleaseMutex(Mutex0);

WaitForSingleObject(Mutex1, INFINITE);

wait = WaitForSingleObject(Mutex0, 100);

if(wait == WAIT_TIMEOUT)continue;

else break;

}

else break;

}

WaitForSingleObject(MutexN, INFINITE);

for(int k=0;k<number;k++)

printf("\t\t");

printf("кушает\n");

ReleaseMutex(MutexN);

Sleep(rand()%500 + 1000);

WaitForSingleObject(MutexN, INFINITE);

for(int k=0;k<number;k++)

printf("\t\t");

printf("думает\n");

ReleaseMutex(MutexN);

ReleaseMutex(Mutex0);

ReleaseMutex(Mutex1);

}

}

void main()

{

setlocale(LC_ALL,"rus");

HANDLE Mutex[Count+1];

HANDLE hThreadArray[Count];

HANDLE hFileMapping = CreateFileMappingA( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(RetArr), lpFileShareName);

lpFileMap = (RetArr *)MapViewOfFile( hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);

strcpy(lpFileMap->MutexName[0],"$MutexName0$");

strcpy(lpFileMap->MutexName[1],"$MutexName1$");

strcpy(lpFileMap->MutexName[2],"$MutexName2$");

strcpy(lpFileMap->MutexName[3],"$MutexName3$");

strcpy(lpFileMap->MutexName[4],"$MutexName4$");

strcpy(lpFileMap->MutexName[5],"$MutexName5$");

Mutex[5] = CreateMutexA(NULL, FALSE, lpFileMap->MutexName[5]);

printf("Философ 1\tФилософ 2\tФилософ 3\tФилософ 4\tФилософ 5\n");

for(int i=0;i<Count;i++)

{

Mutex[i] = CreateMutexA(NULL, FALSE, lpFileMap->MutexName[i]);

hThreadArray[i] = CreateThread( NULL,0,Function,(LPVOID) i,0,NULL);

}

getch();

}

Контрольный пример