Автор работы: Пользователь скрыл имя, 21 Января 2011 в 18:07, курсовая работа
Данная работа состоит из двух основных частей. В теоретической части мы рассмотрим историю возникновения понятия алгоритма, узнаем определение алгоритма, виды и свойства алгоритмов.
В практической части мы выполним решение задачи «О спящем парикмахере» при помощи сети Петри и реализуем данную модель на языке высокого уровня с использованием семафоров (С++).
Введение 3
1 Мультипрограммный режим 4
1.1 Основные положения 4
1.2 Проблема критической секции 5
2 Мониторы хоара 8
2.1 История создания 8
2.2 Определения и основные характеристики 9
2.3 Принцип работы монитора 10
2.4 Условные переменные 11
2.5 Преимущества монитора 12
3 Задача о спящем парикмахере 14
3.1 Постановка задачи 14
3.2 Реализация задачи с помощью сетей Петри 15
3.3 Листинг программы 16
Заключение 22
Список использованных источников 23
}
//----------------------------
DWORD WINAPI barber(LPVOID) //парикмахер
{
While(TRUE)
{
If(count
== 0)
{
Zprint("
MainFormBarber->
//заблокируемся до появления посетителя
WaitForSingleObjec
}
else
{
//получаем доступ к ожидающим
WaitForSingleObject(
count--;
ReleaseSemaphore(
//
ReleaseSemaphore(
getPricheson() ;
}
}
}
//----------------------------
DWORD WINAPI customer(LPVOID) //клиент
{
WaitForSingleObject(
if(count < NUMBER_OF_SEATS ) //если есть свободное место
{
Sleep(SLEEP_PRX);
char buffer2[100];
sprintf(buffer2,
"Пришел %d клиент. Cел на %d кресло
для ожидания",client+1,count+
Zprint((
client++;
count++;
switch ( count ) {
case 1: {MainFormBarber->Label5->
case 2: {MainFormBarber->Label9->
case 3: {MainFormBarber->Label10->
case 4: {MainFormBarber->Label11->
case 5: {MainFormBarber->Label12->
}
MainFormBarber->Label13->
MainFormBarber->
//если парикмахер спит, это его разбудит
ReleaseSemaphore(
ReleaseSemaphore(
//если парикмахер занят, переходим в состояние ожидания
WaitForSingleObject(
}
else
{
Sleep(SLEEP_PRX);
//нет
свободного кресла для
ReleaseSemaphore(mutex,1,
char buffer3[100];
sprintf(buffer3, "Клиент %d видит, что все места заняты и уходит",client+1);
MainFormBarber->
Zprint((
yshed++; //увеличиваем счетчик ушедших
client++;
MainFormBarber->
}
Sleep(SLEEP_PRX);
}
//----------------------------
void getPricheson()
{
char buffer1[100];
sprintf(buffer1,
"Парикмахер стрижет клиента,
который сидел на месте %d",
Zprint((AnsiString)
switch ( count+1 ) {
case 1: {MainFormBarber->Label8->
MainFormBarb
case 2: {MainFormBarber->Label8->
MainFormBarb
case 3: {MainFormBarber->Label8->
MainFormBarb
case 4: {MainFormBarber->Label8->
MainFormBarb
case 5: {MainFormBarber->Label8->
MainFormBarb
}
dovol++;
Sleep(SLEEP_STR);
//приостановка потока на
//----------------------------
void __fastcall
TMainFormBarber::FormDestroy(
{
//удаляемвсесемафоры
CloseHandle(customerSemaphore)
CloseHandle(barberSemaphore);
CloseHandle(mutex);
}
//----------------------------
void __fastcall
TMainFormBarber::clickClick(
{
MainFormBarber->click->
//семафоры
mutex=CreateSemaphore(
customerSemaphore = CreateSemaphore(NULL, 0, 1, NULL);
barberSemaphore = CreateSemaphore(NULL, 0, 1, NULL);
// потоки клиентов и парикмахера
HANDLE
threadCus[NUMBER_OF_CUSTOMERS]
HANDLE threadBar;
DWORD cusThreadId;
DWORD barThreadId;
for(int i=0;i< NUMBER_OF_CUSTOMERS;++i)
{
threadCus[i] = CreateThread(NULL, 0, customer, (LPVOID)i, 0, &cusThreadId);
}
threadBar = CreateThread(NULL, 0, barber, (LPVOID)1, 0, &barThreadId);
}
В данной работе мы раскрыли вопрос о видах и свойствах алгоритмов.
В практической части курсовой работы мы рассмотрели одну из классических задач на синхронизацию потоков – задачу о спящем парикмахере и произвели решение этой задачи с использованием семафоров.