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

os_3

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

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

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

Уфимский государственный авиационный технический университет

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

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

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

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

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

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

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

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

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

Уфа 2022

Задание

Вариант 5. Создать массив, заполнив его рандомно или заранее введенными значениями или вводом пользователем значений. Написать программу, запускающую два дочерних потока. Первый поток последовательно, с помощью датчика случайных чисел, изменяет элементы массива, числами из диапазона от -150 до 150. На экран, с интервалом 1 секунда, выводить текущее состояние элементов массива. Второй поток обнуляет все четные(по значению) элементы массива.

Код

#include <iostream> #include <windows.h> #include<time.h> #include <ctime> #include<iomanip> using namespace std; LONG sum = 0; const int n = 10; LONG arr[n]; int q; void thread01() { srand((unsigned int)time(NULL)); Sleep(1000); switch (q) { case 1: for (int i = 0; i < n; i++) arr[i] = rand() % 200 + 1; break; case 2: for (int i = 0; i < n; i++) arr[i] = 1; break; default: for (int i = 0; i < n; i++) arr[i] = rand() % 200 + 1; break; } } void thread02() { Sleep(1000); srand((unsigned int)time(NULL)); cout << "Первоначальный массив: "; for (int j = 0; j < n; j++) { Sleep(1000); cout << right << setw(5) << arr[j]; } cout << endl; cout << "Массив с измененными значениями: "; int t = 0; while (t < 10) { Sleep(1000); LONG k = rand() % 301 - 150; InterlockedExchange(&arr[t], k); cout << arr[t]<<" "; t++; } } void thread03() { int p = 0; Sleep(27000); cout << endl << "Четные(по значению) элементы массива обнулили: "; for (int i = 0; i < n; i++) { Sleep(1000); if(arr[i] % 2 == 0) InterlockedExchange(&arr[i], 0); cout << arr[i] <<" "; } } int main() { srand(time(NULL)); system("chcp 65001"); cout << "Как хотите заполнить массив?" << endl; cout << "1-Заполнить рандомно" << endl; cout << "2-Заполнить предустановленным массивом" << endl; cin >> q; system("cls"); HANDLE hTh01; DWORD IDTh01; HANDLE hTh02; DWORD IDTh02; HANDLE hTh03; DWORD IDTh03; hTh01 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread01, NULL, 0, &IDTh01); if (hTh01 == NULL) return GetLastError(); hTh02 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread02, NULL, 0, &IDTh02); if (hTh02 == NULL) return GetLastError(); hTh03 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread03, NULL, 0, &IDTh03); if (hTh03 == NULL) return GetLastError(); cin >> q; TerminateThread(hTh01, 0); CloseHandle(hTh01); TerminateThread(hTh02, 0); CloseHandle(hTh02); TerminateThread(hTh03, 0); CloseHandle(hTh03); }

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

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