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

Лабораторная работа №3(1)

.docx
Скачиваний:
4
Добавлен:
10.03.2021
Размер:
58.56 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

Ордена Трудового Красного Знамени

федеральное государственное бюджетное образовательное учреждение

высшего образования

Московский технический университет связи и информатики

----------------------------------------------------------------------------------------------

Кафедра Математической кибернетики и информационных технологий

ЛАБОРАТОРНАЯ РАБОТА № 3

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

ОПЕРАЦИОННЫЕ СИСТЕМЫ

«Методы синхронизация потоков»

Выполнил:

студент Алгазин П.В.

группа БФИ1601

Проверил:

Королькова Т.В.

ст. пр. кафедры МКиИТ

Дата ___________________________

Москва 2018

Название работы: Методы синхронизация потоков.

Цель работы: получение практических навыков по использованию Win32 API для синхронизации потоков.

Задание: Исследование на конкретном примере следующих методов синхронизации потоков:

  1. критические секции;

  2. мьтексы;

  3. события.

Задачу для синхронизации выбрать на свое усмотрение.

Исходный код:

#include <iostream>  #include <Windows.h>  #include <stdio.h>  #include <tlhelp32.h>  #include <conio.h>  #include <locale>  #include <fstream>  #include <thread>  #include <mutex>  using namespace std;  CRITICAL_SECTION cs;  HANDLE Event;  void printСharCS(char ch)//Функция выводит символы  {  EnterCriticalSection(&cs);//Вход в критическую секцию  for (int i = 0; i < 5; i++)  {  cout « ch « " ";  Sleep(400);  }  cout « endl;  LeaveCriticalSection(&cs);//Выход из критической секции  }  void printСharEv(char ch)//Функция выводит символы  {  WaitForSingleObject(Event, INFINITE);//Ожидание наступления события  for (int i = 0; i < 10; i++)  {  cout « ch « " ";  Sleep(400);  }  cout « endl;  }  int main()  {  setlocale(LC_ALL, "rus");  HANDLE Mut = CreateMutexA(NULL, FALSE, "Mut");  DWORD result = WaitForSingleObject(Mut, 0);  if (result != WAIT_OBJECT_0) {  cout « "Это приложение уже запущено";  Sleep(3000);  return 1;  }  int a = -1;  while (a != 0)  {  system("cls");  cout « "1. Критическая секция" « endl  « "2. Мьютекс" « endl  « "3. Событие" « endl  « "0. Выход" « endl;  cout « "Выберите нужный пункт: ";  cin » a;  switch (a) {  case 0:  {  break;  }  case 1:  {  system("cls");  InitializeCriticalSection(&cs);  thread t1(printСharCS,'A');  thread t2(printСharCS,'B');  thread t3(printСharCS,'C');  thread t4(printСharCS,'D');  thread t5(printСharCS,'E');  t1.join();  t2.join();  t3.join();  t4.join();  t5.join();  cout « endl;  system("pause");  break;  }  case 2:  {  ShellExecuteA(NULL, "open", "G:\\3 курс\\1 семестр\\ОС\\Прочее\\Павел\\Лабораторная работа №3\\Debug\\Лабораторная работа №3.1.exe", NULL, NULL, SW_SHOWDEFAULT);  cout « endl;  break;  }  case 3:  {  system("cls");  Event = CreateEventA(NULL, TRUE, FALSE, "First");  thread t1(printСharEv, 'A');  thread t2(printСharEv, 'B');  thread t3(printСharEv, 'C');  thread t4(printСharEv, 'D');  thread t5(printСharEv, 'E');  t1.join();  t2.join();  t3.join();  t4.join();  t5.join();  ResetEvent(Event);  CloseHandle(Event);  cout « endl;  system("pause");  break;  }  }  }  ReleaseMutex(Mut);  CloseHandle(Mut);  return 0;  } #include <iostream>  #include <Windows.h>  #include <tlhelp32.h>  #include<ctime>  using namespace std;  int main()  {  setlocale(LC_ALL, "rus");  HANDLE Event = CreateEventA(NULL, TRUE, FALSE, "First");  srand((unsigned int)time(NULL));  for (int i=0;i<10000;i++)  cout «( rand() % 100 )«" ";  SetEvent(Event); //Наступление события  system("pause");  return 0;  }

}

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