ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)
КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)
ДИСЦИПЛИНА: «Операционные системы и сети»
Лабораторная работа №6.
Разработка многопроцессорной программы под Windows
Выполнил:
Цыганков М.А.
Козлов Н.С.
Тюришев М.А.
Подпись____________
Принял:
Дагаев А.В.
Подпись____________
«_____»________ 2021
Цель работы
Разработать программу, использующую несколько процессов и объекты синхронизации под Windows.
Постановка задачи
Написать две программы, одна из которых будет создавать именованный объект мьютекс, захватывать его и обрабатывать, а вторая открывать созданный первой программой именованный мьютекс и также захватывать и обрабатывать.
Демонстрация работы
Рис. 1 – 1 программа создала и захватила мьютекс, вторая от его открыла
Рис. 2 – 2 программа пытается захватить мьютекс
Рис. 3 – 1 программа освободила мьютекс, вторая его захватила
Код программы
/*lab_6_osis_first.cpp*/
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
void exitProg(HANDLE hMutex);
int main(void)
{
HANDLE hMutex;
hMutex = CreateMutex(NULL, TRUE, TEXT("FirstMutex"));
if (hMutex == NULL)
{
std::cout << "mutex not created: " << GetLastError() << std::endl;
return 0;
}
else
if (GetLastError() == ERROR_ALREADY_EXISTS)
std::cout << "CreateMutex() opened existing mutex" << std::endl;
else std::cout << "new mutex was successfully created" << std::endl;
int answer;
while (true)
{
std::cout << "1: release mutex\n2: capture mutex\n 3: exit\n: ";
std::cin >> answer;
switch (answer)
{
case 1:
{
if (ReleaseMutex(hMutex))
std::cout << "mutex released" << std::endl;
else std::cout << "mutex not released" << std::endl;
break;
}
case 2:
{
std::cout << "waiting..";
DWORD result = WaitForSingleObject(hMutex, INFINITE);
std::cout << ". mutex captured" << std::endl;
break;
}
case 3:
{
exitProg(hMutex);
break;
}
default:
exitProg(hMutex);
}
}
if (hMutex != NULL)
{
CloseHandle(hMutex);
}
return 0;
}
void exitProg(HANDLE hMutex)
{
CloseHandle(hMutex);
exit(0);
}
/* lab_6_osis_two.cpp */
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
void exitProg(HANDLE hMutex);
int main(void)
{
HANDLE hMutex;
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, TEXT("FirstMutex"));
if (hMutex == NULL)
{
std::cout << "mutex not opened: " << GetLastError() << std::endl;
return 0;
}
else std::cout << "mutex was successfully opened" << std::endl;
int answer;
while (true)
{
std::cout << "1: release mutex\n2: capture mutex\n 3: exit\n: ";
std::cin >> answer;
switch (answer)
{
case 1:
{
if (ReleaseMutex(hMutex))
std::cout << "mutex released" << std::endl;
else std::cout << "mutex not released" << std::endl;
break;
}
case 2:
{
std::cout << "waiting..";
DWORD result = WaitForSingleObject(hMutex, INFINITE);
std::cout << ". mutex captured" << std::endl;
break;
}
case 3:
{
exitProg(hMutex);
break;
}
default:
exitProg(hMutex);
}
}
if (hMutex != NULL)
{
CloseHandle(hMutex);
}
return 0;
}
void exitProg(HANDLE hMutex)
{
CloseHandle(hMutex);
exit(0);
}
