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

os_4

.docx
Скачиваний:
0
Добавлен:
07.04.2025
Размер:
66.13 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное учреждение

высшего образования

Уфимский Университет Науки и Технологий

Факультет информатики и робототехники

Кафедра вычислительной математики и кибернетики

Отчет к лабораторной работе №4

По дисциплине «Операционные системы»

По теме «Синхронизация потоков при помощи мьютексов»

Выполнил: студент группы ПРО-232Б

Ихсанова Э. А.

Проверил: доцент каф. ВМиК

Веденяпин И. Э.

Уфа 2022

Задание

Вариант 4. Написать программу, запускающую два дочерних потока. Первый поток с помощью датчика случайных чисел заполняет элементы массива, состоящего из 10 чисел. После заполнения всех элементов второй поток возводит все отрицательные элементы во вторую степень. Вывести на экран исходный и результирующий массивы. Задание выполнить для трех различных массивов. Потоки синхронизировать с помощью мьютекса.

Код

#include <iostream> // v 1 #include <windows.h> using namespace std; int choice = 0; int randmas[10]; int usermas[10] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; int mymas[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int thread01() { HANDLE hMutex01 = OpenMutex(SYNCHRONIZE, FALSE, "MyMutex"); if (hMutex01 == NULL) cout << "Open Mutex01 failed" <<GetLastError() << endl; WaitForSingleObject(hMutex01, INFINITE); for (int i = 0; i < 10; i++) { Sleep(1000); randmas[i] = rand() % 100; } ReleaseMutex(hMutex01); CloseHandle(hMutex01); return 0; } int thread02() { HANDLE hMutex02 = OpenMutex(SYNCHRONIZE, FALSE, "MyMutex"); if (hMutex02 == NULL) cout << "Open Mutex02 failed" << GetLastError() << endl; WaitForSingleObject(hMutex02, INFINITE); switch (choice) { case 1: for (int i = 0; i < 10; i++) { Sleep(1000); if (randmas[i] < 0) randmas[i] = i*i; } break; case 2: for (int i = 0; i < 10; i++) { Sleep(1000); if (usermas[i] < 0) usermas[i] = i*i; } break; case 3: for (int i = 0; i < 10; i++) { Sleep(1000); if (mymas[i] < 0) mymas[i] = i*i; } break; default: for (int i = 0; i < 10; i++) { Sleep(1000); if (mymas[i] < 0) mymas[i] = i*i; if (usermas[i] < 0) usermas[i] = i*i; if (randmas[i] < 0) randmas[i] = i*i; } break; } ReleaseMutex(hMutex02); CloseHandle(hMutex02); return 0; } int thread03() { while (true) { Sleep(1000); system("cls"); cout << "randmas: "; for (int j = 0; j < 10; ++j) cout << randmas[j] << " "; cout << endl; cout << "usermas: "; for (int j = 0; j < 10; ++j) cout << usermas[j] << " "; cout << endl; cout << "mymas: "; for (int j = 0; j < 10; ++j) cout << mymas[j] << " "; cout << endl; } } int main() { system("chcp 65001"); cout << "Введите пользовательский массив (10 целых чисел): "; for (int i = 0; i < 10; ++i) cin >> usermas[i]; //+ cout << "1 - Заменить в рандомном" << endl; cout << "2 - Заменить в пользовательском" << endl; cout << "3 - Заменить в предустановленном" << endl; cout << "4 - Заменить во всех" << endl; int choice = 0; cin >> choice; HANDLE hMutex = CreateMutex(NULL, FALSE, "MyMutex"); if (hMutex == NULL) cout << "Create mutex failed" << GetLastError() << endl; HANDLE hTh01 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread01, NULL, 0, NULL); if (hTh01 == NULL) return GetLastError(); HANDLE hTh02 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread02, NULL, 0, NULL); if (hTh02 == NULL) return GetLastError(); HANDLE hTh03 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread03, NULL, 0, NULL); if (hTh03 == NULL) return GetLastError(); cin >> choice; CloseHandle(hMutex); CloseHandle(hTh01); CloseHandle(hTh02); CloseHandle(hTh03); return 0; }

Р езультат работы

Соседние файлы в предмете Операционные системы