Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОЙ РАБОТЕ по дисциплине Операционные системы РАЗРАБОТКА МН

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 4.6.2024

Федеральное агентство по образованию

"ОМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ"

(ОмГТУ)

Кафедра «Информатика и вычислительная техника»

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОЙ РАБОТЕ

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

РАЗРАБОТКА МНОГОПОТОЧНОГО ПРИЛОЖЕНИЯ

«ТРАНСПОРТНЫЕ ПЕРЕВОЗКИ»

Принял:

преподаватель А.Н. Флоренсов

 

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

Выполнил:

студент гр. ИВТ-336

Пахотина Н.Н.

 

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

Омск 2009


Введение

В современных операционных системах широко используются нити (thread). Это понятие возникло как результат развития понятия абстрактного процесса. Оказалось, что иногда целесообразно процесс – как некоторую общность программного выполнения, имеющую прикладную цель, – разбить на части, которые выполнялись бы параллельно, конкурируя за главный ресурс – процессор, но в остальном выполняли бы общую работу.

Нити принадлежит только текущая совокупность значений в аппаратных узлах хранения информации (регистрах) и локальные переменные подпрограмм. Когда происходит переключение между задачами (нитями), запоминается контекст приостанавливаемой задачи и восстанавливается из места сохранения контекст запускаемой на процессор задачи.

Обычно нить своей работой реализует действия одной из процедур программы. Теоретически любой нити процесса доступны все части программы процесса, в частности, все его процедуры, но реально работа организуется так, чтобы нити отвечала отдельная процедура. Учитывая, что процедуре для нормальной работы необходимы локальные переменные, становится понятным закрепление области этих переменных за нитью.

Если несколько процессов или нитей используют общие данные, то результат совместного использования этих данных может быть совершенно непредсказуем.

Для устранения состязаний процессов (или нитей) используют монополизацию ресурса. Монополизация ресурса – это временное предоставление его в исключительное использование одной нити.

Общий подход к монополизации ресурсов с помощью специальных системных операций предложил голландский математик Е. Дейкстра. Этот подход состоит в построении и использовании семафоров. Семафор – это защищенная от прямого доступа переменная, значения которой можно опрашивать и изменять только с помощью специальных операций


1 Постановка задачи

Разработать для Windows многопоточную программу имитации транспортных перевозок дилижансами по двум круговым маршрутам между городами Дижон, Руан, Париж и Лион. Маршруты отличаются направлением движения – в прямом или обратном направлении. На каждом маршруте работает один дилижанс, вмещающий до 5 пассажиров. При запуске программы, по запросу к пользователю, задается значение параметра N – суммарное число пассажиров, использующих указанные маршруты. Для каждого пассажира, который должен моделироваться отдельной нитью, случайным образом задается время пребывания в городе, после которого он выходит на остановку дилижансов и встает на ожидание дилижанса в одном из двух направлений. Сам этот выбор направления ожидаемого дилижанса осуществляется случайным образом. Отображение состояния имитации осуществлять обязательно в текстовом режиме. Рекомендуется разместить изображения городов в различных углах экрана.

2 Структура данных программы

Исходными данными будет являться общее число пассажиров в системе. Данное значение будет вводиться пользователем при старте программы.

Остальные более детальные моменты описания программных переменных приводятся в коде программы.

3 ПРОГРАММНЫЙ КОД ПРИЛОЖЕНИЯ

#include <windows.h>

#include <stdio.h>

#include <process.h>

#include <dos.h>

#include <conio.h>

#include <time.h>

unsigned long th1id, th2id, th3id;

HANDLE hout, hin, hth1, hth2, hth3;

HANDLE DijIn; //Семафор отвечающий за возможность входа пассажиров

             //в дилижанс1 в Дижоне

HANDLE DijInR; //Семафор отвечающий за возможность входа пассажиров

             //в дилижанс2 в Дижоне

HANDLE RyIn; //Семафор отвечающий за возможность входа пассажиров

             //в дилижанс1 в Руане

HANDLE RyInR; //Семафор отвечающий за возможность входа пассажиров

             //в дилижанс2 в Руане

HANDLE LioIn; //Семафор отвечающий за возможность входа пассажиров

             //в дилижанс1 в Лионе

HANDLE LioInR; //Семафор отвечающий за возможность входа пассажиров

             //в дилижанс2 в Лионе

HANDLE ParIn; //Семафор отвечающий за возможность входа пассажиров

             //в дилижанс1 в Париже

HANDLE ParInR; //Семафор отвечающий за возможность входа пассажиров

             //в дилижанс2 в Париже

HANDLE DijOut; //Семафор отвечающий за возможность выхода пассажиров

             //из дилижанса1 в Дижоне

HANDLE DijOutR; //Семафор отвечающий за возможность выхода пассажиров

             //из дилижанса2 в Дижоне

HANDLE RyOut; //Семафор отвечающий за возможность выхода пассажиров

             //из дилижанса1 в Руане

HANDLE RyOutR; //Семафор отвечающий за возможность выхода пассажиров

             //из дилижанса2 в Руане

HANDLE LioOut; //Семафор отвечающий за возможность выхода пассажиров

             //из дилижанса1 в Лионе

HANDLE LioOutR; //Семафор отвечающий за возможность выхода пассажиров

             //из дилижанса2 в Лионе

HANDLE ParOut; //Семафор отвечающий за возможность выхода пассажиров

             //из дилижанса1 в Париже

HANDLE ParOutR; //Семафор отвечающий за возможность выхода пассажиров

             //из дилижанса2 в Париже

HANDLE sem; //Семафор для корректной отрисовки текста

HANDLE AllOut; //Семафор отвечающий за то, что все пассажиры вышли из дилижанса1 и

              //можно запускать новых

HANDLE AllOutR; //Семафор отвечающий за то, что все пассажиры вышли из дилижанса2 и

              //можно запускать новых

HANDLE AllIn; //Семафор отвечающий за то, что все пассажиры вошли в дилижанс1 и

              //можно лететь

HANDLE AllInR; //Семафор отвечающий за то, что все пассажиры вошли в дилижанс2 и

              //можно лететь

DWORD actlen;

int n; //Количество пассажиров всего

int inDij = 0; //Пассажиров сейчас в Дижоне

int inRy = 0; //Пассажиров сейчас в Руане

int inLio = 0; //Пассажиров сейчас в Лионе

int inPar = 0; //Пассажиров сейчас в Париже

int inDil[2] = {0,0}; //Пассажиров в дилижансе

int inDijGo[2] = {0,0}; //Пассажиров, которые хотят выйти в Дижоне из дилижанса

int inRyGo[2] = {0,0}; //Пассажиров, которые хотят выйти в Руане из дилижанса

int inLioGo[2] = {0,0}; //Пассажиров, которые хотят выйти в Лионе из дилижанса

int inParGo[2] = {0,0}; //Пассажиров, которые хотят выйти в Париже из дилижанса

int inDijIn[2] = {0,0}; //Пассажиров, которые хотят лететь в Дижоне из дилижанса

int inRyIn[2] = {0,0}; //Пассажиров, которые хотят лететь в Руане из дилижанса

int inLioIn[2] = {0,0}; //Пассажиров, которые хотят лететь в Лионе из дилижанса

int inParIn[2] = {0,0}; //Пассажиров, которые хотят лететь в Париже из дилижанса

int sity; //Город в котором находится дилижанс1

int city; //Город в котором находится дилижанс2

void DrawPic()

{

COORD pos,pos1;

       //Процедура рисует текущее положение всех элементов

       

//Для города ставим обозначение

pos.X = 9;

       pos.Y = 1;

       FillConsoleOutputCharacter(hout, 'L', 1, pos, &actlen);

       pos.X = 11;

       FillConsoleOutputCharacter(hout, ' ', 30, pos, &actlen);

//Устанавливаем цвет для желающих уехать

FillConsoleOutputAttribute(hout, GREEN, inLioIn[0] + inLioIn[1], pos, &actlen);

       FillConsoleOutputCharacter(hout, '^', inLioIn[0] + inLioIn[1], pos, &actlen);

       pos.X = 11 + inLioIn[0] + inLioIn[1];

//Устанавливаем цвет для тех кто просто находится в городе

 FillConsoleOutputAttribute(hout, RED, inLio - (inLioIn[0] + inLioIn[1]), pos, &actlen);

       FillConsoleOutputCharacter(hout, '*', inLio - (inLioIn[0] + inLioIn[1]), pos, &actlen);

       pos.X = 9;

       pos.Y = 20;

       FillConsoleOutputCharacter(hout, 'D', 1, pos, &actlen);

       pos.X = 11;

       FillConsoleOutputCharacter(hout, ' ', 30, pos, &actlen);

FillConsoleOutputAttribute(hout, GREEN, inDijIn[0] + inDijIn[1], pos, &actlen);

       FillConsoleOutputCharacter(hout, '^', inDijIn[0] + inDijIn[1], pos, &actlen);

       pos.X = 11 + inDijIn[0] + inDijIn[1];

FillConsoleOutputAttribute(hout, RED, inDij - (inDijIn[0] + inDijIn[1]), pos, &actlen);

       FillConsoleOutputCharacter(hout, '*', inDij - (inDijIn[0] + inDijIn[1]), pos, &actlen);

 

       pos.X = 45;

       pos.Y = 1;

       FillConsoleOutputCharacter(hout, 'P', 1, pos, &actlen);

       pos.X = 47;

       FillConsoleOutputCharacter(hout, ' ', 30, pos, &actlen);

FillConsoleOutputAttribute(hout, GREEN, inParIn[0] + inParIn[1], pos, &actlen);

       FillConsoleOutputCharacter(hout, '^', inParIn[0] + inParIn[1], pos, &actlen);

       pos.X = 47 + inParIn[0] + inParIn[1];

FillConsoleOutputAttribute(hout, RED, inPar - (inParIn[0] + inParIn[1]), pos, &actlen);

       FillConsoleOutputCharacter(hout, '*', inPar - (inParIn[0] + inParIn[1]), pos, &actlen);

 

pos.X = 45;

       pos.Y = 20;

       FillConsoleOutputCharacter(hout, 'R', 1, pos, &actlen);

       pos.X = 47;

       FillConsoleOutputCharacter(hout, ' ', 30, pos, &actlen);

FillConsoleOutputAttribute(hout, GREEN, inRyIn[0] + inRyIn[1], pos, &actlen);

       FillConsoleOutputCharacter(hout, '^', inRyIn[0] + inRyIn[1], pos, &actlen);

       pos.X = 47 + inRyIn[0] + inRyIn[1];

FillConsoleOutputAttribute(hout, RED, inRy - (inRyIn[0] + inRyIn[1]), pos, &actlen);

       FillConsoleOutputCharacter(hout, '*', inRy - (inRyIn[0] + inRyIn[1]), pos, &actlen);

 //Очищаем место под дилижансы

       pos.Y = 0;

       pos.X = 8;

       FillConsoleOutputCharacter(hout, ' ', 8, pos, &actlen);

       pos.Y = 19;

       FillConsoleOutputCharacter(hout, ' ', 8, pos, &actlen);

       pos.Y = 0;

       pos.X = 45;

       FillConsoleOutputCharacter(hout, ' ', 8, pos, &actlen);

pos.Y = 19;

       FillConsoleOutputCharacter(hout, ' ', 8, pos, &actlen);

pos.Y = 2;

       pos.X = 8;

       FillConsoleOutputCharacter(hout, ' ', 8, pos, &actlen);

       pos.Y = 21;

       FillConsoleOutputCharacter(hout, ' ', 8, pos, &actlen);

       pos.Y = 2;

       pos.X = 45;

       FillConsoleOutputCharacter(hout, ' ', 8, pos, &actlen);

pos.Y = 21;

       FillConsoleOutputCharacter(hout, ' ', 8, pos, &actlen);

       //Первый дилижанс

if (sity == 1) pos.Y = 0;  if (sity == 2) pos.Y = 19;

if (sity == 3) pos.Y = 0;  if (sity == 4) pos.Y = 19;

if (sity == 1) pos.X = 8;  if (sity == 2) pos.X = 8;

if (sity == 3) pos.X = 45; if (sity == 4) pos.X = 45;

       FillConsoleOutputCharacter(hout, '[', 1, pos, &actlen);

       pos.X++;

FillConsoleOutputAttribute(hout, GREEN, inDil[0], pos, &actlen);

       FillConsoleOutputCharacter(hout, 'I', inDil[0], pos, &actlen);

       pos.X = pos.X + 5;

       FillConsoleOutputCharacter(hout, ']', 1, pos, &actlen);

       //Второй дилижанс

if (city == 1) pos1.Y = 2;  if (city == 2) pos1.Y = 21;

if (city == 3) pos1.Y = 2;  if (city == 4) pos1.Y = 21;

if (city == 1) pos1.X = 8;  if (city == 2) pos1.X = 8;

if (city == 3) pos1.X = 45; if (city == 4) pos1.X = 45;

       FillConsoleOutputCharacter(hout, '[', 1, pos1, &actlen);

       pos1.X++;

FillConsoleOutputAttribute(hout, GREEN, inDil[1], pos1, &actlen);

       FillConsoleOutputCharacter(hout, 'I', inDil[1], pos1, &actlen);

       pos1.X = pos1.X + 5;

       FillConsoleOutputCharacter(hout, ']', 1, pos1, &actlen);

}

void Man(void *arg)

{

int g, ng, m;

//Стартовый город.

g = arg;

if (g == 1) inLio++;

if (g == 2) inDij++;

if (g == 3) inPar++;

if (g == 4) inRy++;

WaitForSingleObject(sem, INFINITE);

DrawPic();       

ReleaseSemaphore(sem, 1, NULL);

do

{

 randomize();

 //Находимся в городе

 Sleep(random(9000)+1000);

 //Город по счету, в котором надо выйти

 ng = random(3)+1;

 if (ng == g)

  {

      if (g == 4) ng--;

else ng++;

   }

 //Маршрут по которому поедем

 m = random(2);

 if (m > 1) m =0;

 //Ждем дилижанса 

 if (g == 1)  

   {

    inLioIn[m]++;

    WaitForSingleObject(sem, INFINITE);

    DrawPic();       

    ReleaseSemaphore(sem, 1, NULL);

    if (m == 0)

    WaitForSingleObject(LioIn, INFINITE);

    else WaitForSingleObject(LioInR, INFINITE);

   }

 if (g == 2)  

   {

    inDijIn[m]++;

    WaitForSingleObject(sem, INFINITE);

    DrawPic();       

    ReleaseSemaphore(sem, 1, NULL);

    if (m == 0)

    WaitForSingleObject(DijIn, INFINITE);

    else WaitForSingleObject(DijInR, INFINITE);

   }

 if (g == 3)  

   {

    inParIn[m]++;

    WaitForSingleObject(sem, INFINITE);

    DrawPic();       

    ReleaseSemaphore(sem, 1, NULL);

    if (m == 0)

    WaitForSingleObject(ParIn, INFINITE);

    else WaitForSingleObject(ParInR, INFINITE);

   }

 if (g == 4)  

   {

    inRyIn[m]++;

    WaitForSingleObject(sem, INFINITE);

    DrawPic();       

    ReleaseSemaphore(sem, 1, NULL);

    if (m == 0)

    WaitForSingleObject(RyIn, INFINITE);

    else WaitForSingleObject(RyInR, INFINITE);

   }

 //Если в дилижансе нет мест

 if (inDil[m] >= 5)

 {

   //Ждем опять

   if (m == 0)

   {  

     if (g == 1) WaitForSingleObject(LioIn, INFINITE);

     if (g == 2) WaitForSingleObject(DijIn, INFINITE);

     if (g == 3) WaitForSingleObject(ParIn, INFINITE);

     if (g == 4) WaitForSingleObject(RyIn, INFINITE);

   }

   if (m == 1)

   {

     if (g == 1) WaitForSingleObject(LioInR, INFINITE);

     if (g == 2) WaitForSingleObject(DijInR, INFINITE);

     if (g == 3) WaitForSingleObject(ParInR, INFINITE);

     if (g == 4) WaitForSingleObject(RyInR, INFINITE);

   }

 }

 //Занимаем одно место

 inDil[m]++;

    

 //Дождались дилижанса, разрешим другим входить тоже

 if (g == 1) { inLio--; inLioIn[m]--; if (inLioIn[m] > 0) if (m == 0) ReleaseSemaphore(LioIn, 1, NULL); else ReleaseSemaphore(LioInR, 1, NULL);}

 if (g == 2) { inDij--; inDijIn[m]--; if (inDijIn[m] > 0) if (m == 0) ReleaseSemaphore(DijIn, 1, NULL); else ReleaseSemaphore(DijInR, 1, NULL);}

 if (g == 3) { inPar--; inParIn[m]--; if (inParIn[m] > 0) if (m == 0) ReleaseSemaphore(ParIn, 1, NULL); else ReleaseSemaphore(ParInR, 1, NULL);}

 if (g == 4) { inRy--; inRyIn[m]--; if (inRyIn[m] > 0) if (m == 0) ReleaseSemaphore(RyIn, 1, NULL); else ReleaseSemaphore(RyInR, 1, NULL);}

 //Смотрим если желающих ехать больше нет, значит можно отъезжать

 if (g == 1 && (inLioIn[m] == 0 || inDil[m] == 5)) if (m == 0) ReleaseSemaphore(AllIn, 1, NULL); else ReleaseSemaphore(AllInR, 1, NULL);

 if (g == 2 && (inDijIn[m] == 0 || inDil[m] == 5)) if (m == 0) ReleaseSemaphore(AllIn, 1, NULL); else ReleaseSemaphore(AllInR, 1, NULL);

 if (g == 3 && (inParIn[m] == 0 || inDil[m] == 5)) if (m == 0) ReleaseSemaphore(AllIn, 1, NULL); else ReleaseSemaphore(AllInR, 1, NULL);

 if (g == 4 && (inRyIn[m] == 0 || inDil[m] == 5)) if (m == 0) ReleaseSemaphore(AllIn, 1, NULL); else ReleaseSemaphore(AllInR, 1, NULL);

 //Отрисуем

 WaitForSingleObject(sem, INFINITE);

 DrawPic();       

 ReleaseSemaphore(sem, 1, NULL);

 //Ждем когда дилижанс приедет и можно будет выйти

 if (ng == 1) {inLioGo[m]++; if (m == 0) WaitForSingleObject(LioOut, INFINITE); else WaitForSingleObject(LioOutR, INFINITE);}

 if (ng == 2) {inDijGo[m]++; if (m == 0) WaitForSingleObject(DijOut, INFINITE); else WaitForSingleObject(DijOutR, INFINITE);}

 if (ng == 3) {inParGo[m]++; if (m == 0) WaitForSingleObject(ParOut, INFINITE); else WaitForSingleObject(ParOutR, INFINITE);}

 if (ng == 4) {inRyGo[m]++; if (m == 0) WaitForSingleObject(RyOut, INFINITE); else WaitForSingleObject(RyOutR, INFINITE);}

 if (m == 0)

 while (ng != sity) {}

 

 if (m == 1)

 while (ng != city) {}

 //Выходим из дилижанса

 inDil[m]--;

 //Заходим в город 

 if (ng == 1) {inLioGo[m]--; inLio++; if (inLioGo[m] > 0) if (m == 0) ReleaseSemaphore(LioOut, 1, NULL); else ReleaseSemaphore(LioOutR, 1, NULL);}

 if (ng == 2) {inDijGo[m]--; inDij++; if (inDijGo[m] > 0) if (m == 0) ReleaseSemaphore(DijOut, 1, NULL); else ReleaseSemaphore(DijOutR, 1, NULL);}

 if (ng == 3) {inParGo[m]--; inPar++; if (inParGo[m] > 0) if (m == 0) ReleaseSemaphore(ParOut, 1, NULL); else ReleaseSemaphore(ParOutR, 1, NULL);}

 if (ng == 4) {inRyGo[m]--; inRy++; if (inRyGo[m] > 0) if (m == 0) ReleaseSemaphore(RyOut, 1, NULL); else ReleaseSemaphore(RyOutR, 1, NULL);}

 //Текущий город = город в котором только что вышли

 g = ng;

 //Отрисуем

 WaitForSingleObject(sem, INFINITE);

 DrawPic();

 ReleaseSemaphore(sem, 1, NULL);

 //Смотрим если желающих выйти больше нет, значит можно запускать новых

 if (ng == 1 && inLioGo[m] == 0) if (m == 0) ReleaseSemaphore(AllOut, 1, NULL); else ReleaseSemaphore(AllOutR, 1, NULL);

 if (ng == 2 && inDijGo[m] == 0) if (m == 0) ReleaseSemaphore(AllOut, 1, NULL); else ReleaseSemaphore(AllOutR, 1, NULL);

 if (ng == 3 && inParGo[m] == 0) if (m == 0) ReleaseSemaphore(AllOut, 1, NULL); else ReleaseSemaphore(AllOutR, 1, NULL);

 if (ng == 4 && inRyGo[m] == 0) if (m == 0) ReleaseSemaphore(AllOut, 1, NULL); else ReleaseSemaphore(AllOutR, 1, NULL);

 //Отрисуем

 WaitForSingleObject(sem, INFINITE);

 DrawPic();

 ReleaseSemaphore(sem, 1, NULL);

} while (1);

}

//Первый дилижанс

void Dil1(void *arg)

{

do

{

 //Летим

 Sleep(2000);

 if (inDil[0] > 0)

 {

  //Разрешаем выходить в этом городе

  if (inLioGo[0] > 0 && sity == 1) { ReleaseSemaphore(LioOut, 1, NULL);}

  if (inDijGo[0] > 0 && sity == 2) { ReleaseSemaphore(DijOut, 1, NULL);}

  if (inParGo[0] > 0 && sity == 3) { ReleaseSemaphore(ParOut, 1, NULL);}

  if (inRyGo[0] > 0 && sity == 4) { ReleaseSemaphore(RyOut, 1, NULL);}

 

  //Ждем пока все выйдут

  if (sity == 1 && inLioGo[0] > 0) { WaitForSingleObject(AllOut, INFINITE);}

  if (sity == 2 && inDijGo[0] > 0) { WaitForSingleObject(AllOut, INFINITE);}

  if (sity == 3 && inParGo[0] > 0) { WaitForSingleObject(AllOut, INFINITE);}

  if (sity == 4 && inRyGo[0] > 0) { WaitForSingleObject(AllOut, INFINITE);}

  

 }

 //Разрешаем входить в этом городе

 if (inDil[0] < 5)

 {

   if (sity == 1 && inLioIn[0] > 0) { ReleaseSemaphore(LioIn, 1, NULL); WaitForSingleObject(AllIn, INFINITE);}

   if (sity == 2 && inDijIn[0] > 0) { ReleaseSemaphore(DijIn, 1, NULL); WaitForSingleObject(AllIn, INFINITE);}

   if (sity == 3 && inParIn[0] > 0) { ReleaseSemaphore(ParIn, 1, NULL); WaitForSingleObject(AllIn, INFINITE);}

   if (sity == 4 && inRyIn[0] > 0) { ReleaseSemaphore(RyIn, 1, NULL); WaitForSingleObject(AllIn, INFINITE);}

 }

 Sleep(1000);

 //Приехали в следующий город

 sity++;

 if (sity > 4) sity = 1;

 //Отрисуем

 WaitForSingleObject(sem, INFINITE);

 DrawPic();

 ReleaseSemaphore(sem, 1, NULL);

}

while (1);

}

//Второй дилижанс 

void Dil2(void *arg)

{

do

{

 //Едем

 Sleep(2000);

 if (inDil[1] > 0)

 {

  //Разрешаем выходить в этом городе

  if (inLioGo[1] > 0 && city == 1) { ReleaseSemaphore(LioOutR, 1, NULL);}

  if (inDijGo[1] > 0 && city == 2) { ReleaseSemaphore(DijOutR, 1, NULL);}

  if (inParGo[1] > 0 && city == 3) { ReleaseSemaphore(ParOutR, 1, NULL);}

  if (inRyGo[1] > 0 && city == 4) { ReleaseSemaphore(RyOutR, 1, NULL);}

 

  //Ждем пока все выйдут

  if (city == 1 && inLioGo[1] > 0) { WaitForSingleObject(AllOutR, INFINITE);}

  if (city == 2 && inDijGo[1] > 0) { WaitForSingleObject(AllOutR, INFINITE);}

  if (city == 3 && inParGo[1] > 0) { WaitForSingleObject(AllOutR, INFINITE);}

  if (city == 4 && inRyGo[1] > 0) { WaitForSingleObject(AllOutR, INFINITE);}

  

 }

 //Разрешаем входить в этом городе

 if (inDil[1] < 5)

 {

   if (city == 1 && inLioIn[1] > 0) { ReleaseSemaphore(LioInR, 1, NULL); WaitForSingleObject(AllInR, INFINITE);}

   if (city == 2 && inDijIn[1] > 0) { ReleaseSemaphore(DijInR, 1, NULL); WaitForSingleObject(AllInR, INFINITE);}

   if (city == 3 && inParIn[1] > 0) { ReleaseSemaphore(ParInR, 1, NULL); WaitForSingleObject(AllInR, INFINITE);}

   if (city == 4 && inRyIn[1] > 0) { ReleaseSemaphore(RyInR, 1, NULL); WaitForSingleObject(AllInR, INFINITE);}

 }

 Sleep(1000);

 //Приехали в следующий город

 city--;

 if (city == 0) city = 4;

 //Отрисуем

 WaitForSingleObject(sem, INFINITE);

 DrawPic();

 ReleaseSemaphore(sem, 1, NULL);

}

while (1);

}

//Основной текст программы           

int main()

{

int i, tmp = 0,tmp1 = 0;

char c[10];

char *endptr;

COORD pos;

       //Получаем хэндлы ввода/вывода

       hout = GetStdHandle(STD_OUTPUT_HANDLE);

       hin = GetStdHandle(STD_INPUT_HANDLE);

       pos.X = 0;

       pos.Y = 0;

       

//Начальный город для дилижансов

       sity = 1;

city = 4;

       //Запросим число пассажиров

       do

 {

 clrscr();

 printf("BBeDuTe 4ucLo nacca>|<upoB:");

        fgets(c,10,stdin);

        n = strtol(c,&endptr,10);}

while (n==0);

        

       clrscr();

       //Инициализируем семафоры

       sem = CreateSemaphore(NULL, 1, 1, NULL);            LioIn = CreateSemaphore(NULL, 0, 1, NULL);

       DijIn = CreateSemaphore(NULL, 0, 1, NULL);           ParIn = CreateSemaphore(NULL, 0, 1, NULL);

       RyIn = CreateSemaphore(NULL, 0, 1, NULL);           LioOut = CreateSemaphore(NULL, 0, 1, NULL);

       DijOut = CreateSemaphore(NULL, 0, 1, NULL);        ParOut = CreateSemaphore(NULL, 0, 1, NULL);

       RyOut = CreateSemaphore(NULL, 0, 1, NULL);        AllOut = CreateSemaphore(NULL, 0, 1, NULL);

       AllIn = CreateSemaphore(NULL, 0, 1, NULL);

       LioInR = CreateSemaphore(NULL, 0, 1, NULL);           DijInR = CreateSemaphore(NULL, 0, 1, NULL);

       ParInR = CreateSemaphore(NULL, 0, 1, NULL); RyInR = CreateSemaphore(NULL, 0, 1, NULL);

       LioOutR = CreateSemaphore(NULL, 0, 1, NULL);       DijOutR = CreateSemaphore(NULL, 0, 1, NULL);

       ParOutR = CreateSemaphore(NULL, 0, 1, NULL); RyOutR = CreateSemaphore(NULL, 0, 1, NULL);

       AllOutR = CreateSemaphore(NULL, 0, 1, NULL);        AllInR = CreateSemaphore(NULL, 0, 1, NULL);

//Отрисуем

       DrawPic();

       tmp1 = n;

       for (i = 0; i < n; i++)

       {

               //Запускаем нити пассажиров, посылаем им стартовый город

               if (tmp1>0) {tmp = random(4)+1; tmp1--;}

 hth1=(HANDLE)_beginthreadNT(Man,4096,(void *)tmp,NULL,NULL,&th1id);

 Sleep(1000);

       }

       //Запускаем нить первого и второго дилижанса

       hth2=(HANDLE)_beginthreadNT(Dil1, 4096, NULL,0,0,&th2id);

       hth3=(HANDLE)_beginthreadNT(Dil2, 4096, NULL,0,0,&th3id);

       getchar();

//Закрываем хэндлы

CloseHandle(hth1);     CloseHandle(hth2);

CloseHandle(hth3);

CloseHandle(sem);            CloseHandle(LioIn);          CloseHandle(DijIn);            CloseHandle(ParIn);

CloseHandle(RyIn);           CloseHandle(LioOut);        CloseHandle(DijOut);        CloseHandle(ParOut);

CloseHandle(RyOut);        CloseHandle(AllOut);        CloseHandle(AllIn);

CloseHandle(LioInR);           CloseHandle(DijInR);

CloseHandle(ParInR);         CloseHandle(RyInR);

CloseHandle(LioOutR);       CloseHandle(DijOutR);

CloseHandle(ParOutR);       CloseHandle(RyOutR);

CloseHandle(AllOutR);        CloseHandle(AllInR);

       return 0;

}


Заключение

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

Полученные при тестировании данные говорят о правильности работы программы.


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

1) Флоренсов А.Н. Операционные системы для программиста: Учеб. пособие. – Омск: Изд-во ОмГТУ, 2005 г. – 240 с.




1. Увеличить план до 1-25 на миллиметровой бумаге
2. Контрольная работа- Управление персоналом в структурной среде.html
3. Гендель Георг Фридрих
4. Международное разделение труд
5. Отчет по Технологической практике за период с 3
6. варварские королевства в начале I тысячелетия новой эры
7. Права потребителя.html
8. ВАРИАНТ I ЧАСТЬ 2 Прочтите текст и выполните А1 ~А7; В1 ~ В9
9. Введение Анализ оборотных активов является одним из важнейших разделов анализа бухгалтерской отчетности.html
10. юридичні технології Практична робота 1 інформаційнІ потРеби користувачів Завдання 1- Завантажт
11. ПОЯСНИТЕЛЬНАЯ ЗАПИСКА В резолюции 49-184 Генеральной Ассамблеи от 23 декабря 1994 года десятилетний период начи
12. АНАЛІЗ АВТОРСЬКИХ НЕОЛОГІЗМІВ НА ПРИКЛАДІ ПОТТЕРІАНИ ДЖ.К. РОУЛІНГ (УКРАЇНСЬКИЙ ТА РОСІЙСЬКИЙ ВАРІАНТИ ПЕРЕКЛАДУ)
13. тематическая модель.
14. темах с ЧРК Канал ТЧ 3403 кГц дополняется защитным промежутком 09 кГц
15. Анализ школьной программы по лыжной подготовке
16. які соціальні утворення неможливо уявити без людини її активної творчої діяльності одним з наслідків якої
17. так больно уя
18. а метод определения показателей качества продукции на основе анализа восприятий органов чувств зрения о
19. Основы всестороннего обеспечения боевых действий
20. Налоговая реформа в России 1992 г, ее необходимость и значение