Лабораторная работа №3(1)
.docx
ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Ордена Трудового Красного Знамени
федеральное государственное бюджетное образовательное учреждение
высшего образования
Московский технический университет связи и информатики
----------------------------------------------------------------------------------------------
Кафедра Математической кибернетики и информационных технологий
ЛАБОРАТОРНАЯ РАБОТА № 3
по дисциплине
ОПЕРАЦИОННЫЕ СИСТЕМЫ
«Методы синхронизация потоков»
Выполнил:
студент Алгазин П.В.
группа БФИ1601
Проверил:
Королькова Т.В.
ст. пр. кафедры МКиИТ
Дата ___________________________
Москва 2018
Название работы: Методы синхронизация потоков.
Цель работы: получение практических навыков по использованию Win32 API для синхронизации потоков.
Задание: Исследование на конкретном примере следующих методов синхронизации потоков:
критические секции;
мьтексы;
события.
Задачу для синхронизации выбрать на свое усмотрение.
Исходный код:
#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 - Результат выполнения программы