Скачиваний:
0
Добавлен:
15.04.2026
Размер:
60.65 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ

УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)

КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)

ДИСЦИПЛИНА: «Операционные системы и сети»

Лабораторная работа №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);

}

Соседние файлы в папке Лабы