Лабораторные работы / Лабораторная работа 3
.docxФЕДЕРАЛЬНОЕ АГЕНСТВО СВЯЗИ
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Московский технический университет связи и информатики»
Центр заочного обучения по программам бакалавриата
Кафедра «Математической кибернетики и информационных технологий»
Лабораторная работа № 3.
«Методы синхронизации потоков»
Выполнил: Иванов Иван, студент группы БСТ17хх
Цель работы:
Получение практических навыков в использовании Win32 API для синхронизации потоков.
Задание:
Разработать программное обеспечение для исследования на конкретном примере следующих методов синхронизации потоков:
Критические секции
Мьютексы
События
Задачу для синхронизации выбрать на свое усмотрение.
В первой программе критические секции используются при работе с общим массивом. Один поток записывает значения в массив, второй поток «обнуляет» массив, третий поток вывод текущее значение массива.
Во второй программе используется мьютекс при работе двух процессов с общим файлом. Первый процесс записывает в файл, второй читает из файла.
В третьей программе используются события. Основной поток создает несколько дочерних потоков, каждый из которых дожидается события в основном потоке, после чего выполняет свою работу.
Результат работы первой программы:
Результат работы второй программы:
Результат работы третьей программы
Листинг кода первой программы.
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <process.h>
// Код с использованием критической секции
#define MAX_ARRAY 5
CRITICAL_SECTION CriticalSection;
int test[MAX_ARRAY];
void EmptyArray(void*);
void PrintArray(void*);
void FullArray(void*);
using namespace std;
int main()
{
InitializeCriticalSection(&CriticalSection);
if (_beginthread(EmptyArray, 1024, NULL) == -1)
cout << "Error begin thread " << endl;
if (_beginthread(PrintArray, 1024, NULL) == -1)
cout << "Error begin thread " << endl;
if (_beginthread(FullArray, 1024, NULL) == -1)
cout << "Error begin thread " << endl;
system("pause");
DeleteCriticalSection(&CriticalSection);
return 0;
}
void EmptyArray(void*)
{
while (true)
{
EnterCriticalSection(&CriticalSection);
cout << "EmptyArray" << endl;
for (int x = 0; x < (MAX_ARRAY + 1); x++) test[x] = 0;
LeaveCriticalSection(&CriticalSection);
Sleep(5000);
}
}
void PrintArray(void*)
{
while (true)
{
EnterCriticalSection(&CriticalSection);
cout << "PrintArray" << endl;
for (int x = 0; x < (MAX_ARRAY + 1); x++) cout << test[x] << " ";
cout << endl;
LeaveCriticalSection(&CriticalSection);
Sleep(2000);
}
}
void FullArray(void*)
{
while (true)
{
EnterCriticalSection(&CriticalSection);
cout << "FullArray" << endl;
for (int x = 0; x < (MAX_ARRAY + 1); x++) test[x] = x;
LeaveCriticalSection(&CriticalSection);
Sleep(1000);
}
}
Листинг кода второй программы, пишущей в файл:
#include <iostream>
#include <windows.h>
#include <fstream>
int main()
{
HANDLE mut;
mut = CreateMutex(NULL, FALSE, L"FileMut");
DWORD result;
std::ofstream myfile;
BOOL exit = false;
while(exit == false)
{
if (GetAsyncKeyState(VK_ESCAPE))
{
exit = true;
}
result = WaitForSingleObject(mut, INFINITE);
if (result == WAIT_OBJECT_0)
{
std::cout << "Writing to file" << "\n";
std::cout << "Press ESC to exit" << "\n";
myfile.open("C:\\Users\\Flyin\\Desktop\\example.txt");
myfile << "Writing this to a file.\n";
myfile << "And this";
myfile.close();
Sleep(5000);
ReleaseMutex(mut);
}
else
std::cout << "fail programm running" << std::endl;
}
CloseHandle(mut);
}
Листинг кода второй программы, читающей из файла:
int main()
{
HANDLE mut;
mut = CreateMutex(NULL, FALSE, L"FileMut");
DWORD result;
BOOL exit = false;
while (exit == false)
{
if (GetAsyncKeyState(VK_ESCAPE))
{
exit = true;
}
result = WaitForSingleObject(mut, INFINITE);
if (GetAsyncKeyState(VK_ESCAPE))
{
exit = true;
}
if (result == WAIT_OBJECT_0)
{
std::cout << "Reading from file" << "\n";
std::cout << "Press ESC to exit" << "\n";
std::ifstream f("C:\\Users\\Flyin\\Desktop\\example.txt");
if (f.is_open())
std::cout << f.rdbuf();
std::cout << "\n";
Sleep(5000);
ReleaseMutex(mut);
}
else
std::cout << "fail programm running" << std::endl;
}
CloseHandle(mut);
}
Листинг кода третьей программы:
#include <windows.h>
#include <iostream>
#include <process.h>
HANDLE event;
void Thread(void*);
int main()
{
event = CreateEvent(NULL, TRUE, FALSE, L"FirstStep");
if (_beginthread(Thread, 1024, NULL) == -1)
std::cout << "Error begin thread " << "\n";
if (_beginthread(Thread, 1024, NULL) == -1)
std::cout << "Error begin thread " << "\n";
if (_beginthread(Thread, 1024, NULL) == -1)
std::cout << "Error begin thread " << "\n";
if (event != NULL) {
Sleep(1000);
SetEvent(event);
Sleep(1000);
ResetEvent(event);
CloseHandle(event);
}
else {
std::cout << "error create event" << "\n";
}
}
void Thread(void*)
{
DWORD dwWaitResult;
dwWaitResult = WaitForSingleObject(event, INFINITE);
std::cout << "Thread work" << "\n";
_endthread();
}
Москва 2020