
os_2
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
Уфимский государственный авиационный технический университет
Факультет информатики и робототехники
Кафедра вычислительной математики и кибернетики
Отчет к лабораторной работе №2
По дисциплине «Операционные системы»
По теме «Потоки»
Выполнил: студент группы ПРО-232Б
Ихсанова Э. А.
Проверил: доцент каф. ВМиК
Веденяпин И. Э.
Уфа 2022
Задание
Вариант 12. Написать программу, запускающую три дочерних потока. Каждый поток увеличивает (начиная с 0) значение счетчика с разной скоростью (использовать функцию sleep). При нажатии на клавишу ‘q’ закрыть все потоки и завершить выполнение программы. Приостановить выполнение первого потока, пока счетчики второго и третьего не достигнут значения 80.
Код
#include<iostream> #include<Windows.h> #include <conio.h> using namespace std; int n = 0, p = 0, t = 0; bool third = false; bool second = false; bool both = false; HANDLE hTh01, hTh02, hTh03,hThread, hTh05; void thread01() { while (true) { if(third && second) n++; Sleep(100); } return; } void thread02() { while (true) { p++; Sleep(200); } return; } void thread03() { while (true) { t++; Sleep(300); } return; } void thread05() { int temp = 0; do { if (p % 10 == 0 &&p != temp && p != temp + 1) { cout << "Первый поток: " << n << endl; cout << "Второй поток: " << p << endl; cout << "Третий поток: " << t << endl << endl; temp = p; if (p >= 80 && !second) { cout << "p = " << p << " ,2ой поток достиг 80" << endl; second = true; } if (t >= 80 && !third) { cout << "t = " << t << " ,3ий поток достиг 80" << endl; third = true; } if(second && third && !both) { cout << "Оба потока достигли 80и, 1ый поток запущен" << endl; both = true; } } } while (true); } int main() { system("chcp 65001"); char c; DWORD IDTh01; DWORD IDTh02; DWORD IDTh03; DWORD IDTh05; DWORD IDThread; cout << "Потоки запущены: " << endl; hTh01 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread01, NULL, 0, &IDTh01); hTh02 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread02, NULL, 0, &IDTh02); hTh03 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread03, NULL, 0, &IDTh03); hTh05 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread05, NULL, 0, &IDTh05); if (hTh05 == NULL) return GetLastError(); cin.get(); cout << endl << "Введите q, чтобы закрыть поток "; char ch = NULL; while (ch != 'q') ch = _getch(); TerminateThread(hThread, 0); CloseHandle(hThread); CloseHandle(hTh01); CloseHandle(hTh02); CloseHandle(hTh03); CloseHandle(hTh05); }
Результат работы