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

Лабораторные работы / Лабораторная работа 3

.docx
Скачиваний:
59
Добавлен:
15.02.2021
Размер:
68.72 Кб
Скачать

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

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Московский технический университет связи и информатики»

Центр заочного обучения по программам бакалавриата

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

Лабораторная работа № 3.

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

Выполнил: Иванов Иван, студент группы БСТ17хх

Цель работы:

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

Задание:

Разработать программное обеспечение для исследования на конкретном примере следующих методов синхронизации потоков:

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

  2. Мьютексы

  3. События

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

В первой программе критические секции используются при работе с общим массивом. Один поток записывает значения в массив, второй поток «обнуляет» массив, третий поток вывод текущее значение массива.

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

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

Результат работы первой программы:

Результат работы второй программы:

Результат работы третьей программы

Листинг кода первой программы.

#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