Реализация механизма мониторов. Хоара в мультипрограммных системах. Задача о спящем парикмахере

Автор работы: Пользователь скрыл имя, 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

Файлы: 1 файл

Курсовая работа.docx

— 167.10 Кб (Скачать файл)
y">MainFormBarber->Memo1->Lines->Add("[" + Time() + " " + Date() + "]==> " + text);

}

//---------------------------------------------------------------------------------------------------------------

DWORD WINAPI barber(LPVOID)       //парикмахер

{

While(TRUE)

{

     If(count == 0)                                        //нет никого, тогда посплю

      {

            Zprint("Парикмахер  решил вздремнуть");

            MainFormBarber->Label8->Caption = "Сплю";

         //заблокируемся  до появления посетителя

            WaitForSingleObject(customerSemaphore,INFINITE);  

      }

      else                                                      //буду работать тогда

      {

            //получаем доступ  к ожидающим

         WaitForSingleObject(mutex,INFINITE);            

            count--;                                          //уменьшаем кол-во ожидающих клиентов

            ReleaseSemaphore(mutex,1,NULL);            //выход из критической области

            //парикмахерготовкработе

            ReleaseSemaphore(barberSemaphore,1,NULL);

            getPricheson() ;                                  //получить модную стрижку 

      }

}

}

//--------------------------------------------------------------------------

DWORD WINAPI customer(LPVOID)     //клиент

{

      WaitForSingleObject(mutex,INFINITE);    //вход в критическую область 

      if(count < NUMBER_OF_SEATS )                           //если есть свободное место

      {

            Sleep(SLEEP_PRX);                                  //приостановка потока

            char buffer2[100];

      sprintf(buffer2, "Пришел %d клиент. Cел на %d кресло  для ожидания",client+1,count+1);

            Zprint((AnsiString)buffer2);

            client++;                                      //увеличиваем счетчик клиентов

            count++;                                   // увеличиваем кол-во ожидающих  клиентов

            switch ( count ) {

            case 1: {MainFormBarber->Label5->Caption = IntToStr(client); break;}

            case 2: {MainFormBarber->Label9->Caption = IntToStr(client); break;}

            case 3: {MainFormBarber->Label10->Caption = IntToStr(client); break;}

            case 4: {MainFormBarber->Label11->Caption = IntToStr(client); break;}

            case 5: {MainFormBarber->Label12->Caption = IntToStr(client); break;}

            

         MainFormBarber->Label13->Caption = "Свободно!";

            MainFormBarber->Label14->Caption = IntToStr(client);

         //если парикмахер спит, это его разбудит

            ReleaseSemaphore(customerSemaphore,1,NULL);      

            ReleaseSemaphore(mutex,1,NULL);          // выходи из критической области

            //если парикмахер занят, переходим в состояние ожидания

         WaitForSingleObject(barberSemaphore,INFINITE); 

      }

      else

      {

            Sleep(SLEEP_PRX);                                       //приостановка потока

      //нет  свободного кресла для ожидания  – идем домой. Выход из критической области

         ReleaseSemaphore(mutex,1,NULL);                   

            char buffer3[100];

      sprintf(buffer3, "Клиент %d видит, что все места  заняты и уходит",client+1);

            MainFormBarber->Label13->Caption = "Занято!!!";

            Zprint((AnsiString)buffer3);

         yshed++;              //увеличиваем счетчик ушедших

            client++;                                          //увеличиваем счетчик клиентов

            MainFormBarber->Label14->Caption = IntToStr(client);

      }

   Sleep(SLEEP_PRX);                                       //приостановка потока

}

//---------------------------------------------------------------------------------------------------------------

void getPricheson()                                       //функция стрижки

{

      char buffer1[100];

    sprintf(buffer1, "Парикмахер стрижет клиента,  который сидел на месте %d",count+1);

      Zprint((AnsiString)buffer1);

            switch ( count+1 ) {

                  case 1: {MainFormBarber->Label8->Caption = IntToStr(client);

                  MainFormBarber->Label5->Caption =""; break;}

                  case 2: {MainFormBarber->Label8->Caption = IntToStr(client);

                  MainFormBarber->Label9->Caption =""; break;}

                  case 3: {MainFormBarber->Label8->Caption = IntToStr(client);

                  MainFormBarber->Label10->Caption =""; break;}

                  case 4: {MainFormBarber->Label8->Caption = IntToStr(client);

                  MainFormBarber->Label11->Caption =""; break;}

                  case 5: {MainFormBarber->Label8->Caption = IntToStr(client);

                  MainFormBarber->Label12->Caption =""; break;}

            }

      dovol++;                                                //увеличиваем счетчик бритоголовых

      Sleep(SLEEP_STR);       //приостановка потока на время  стрижки

//---------------------------------------------------------------------------------------------------------------

void __fastcall TMainFormBarber::FormDestroy(TObject *Sender)

{

   //удаляемвсесемафоры

CloseHandle(customerSemaphore);

   CloseHandle(barberSemaphore);

   CloseHandle(mutex); 

}

//---------------------------------------------------------------------------------------------------------------

void __fastcall TMainFormBarber::clickClick(TObject *Sender) //обработчик кнопки

{

      MainFormBarber->click->Enabled = false;

       //семафоры

      mutex=CreateSemaphore(NULL,1,1,NULL);

      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);


    Заключение

    В данной работе мы раскрыли вопрос о  видах и свойствах алгоритмов.

    В практической части курсовой работы мы рассмотрели одну из классических задач на синхронизацию потоков – задачу  о спящем парикмахере и произвели решение этой задачи с использованием семафоров.

 

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

  1. Э. Таненбаум  – Современные ОС. – Москва: Изд. 3-е. М.:Питер.–2010.–1116c.
  2. Е. В. Рабинович  – Теория вычислительных процессов.– Новосибирск: Изд. 1-е. Новосибирск :Издательство НГТУ–2008.–162 c.
  3. Иванв В. Е., Сабельфельд В.Н. Алгоритмы. – М.: Наука, 2003.–98c.

Информация о работе Реализация механизма мониторов. Хоара в мультипрограммных системах. Задача о спящем парикмахере