Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_Лаб3_new.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
176 Кб
Скачать
☆

Хід виконання роботи.

Задача 1. Приклад програми:

#include <windows.h>

int main()

{

STARTUPINFO si;

PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

// створення нового процесу

CreateProcess("c:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE, REALTIME_PRIORITY_CLASS, NULL, NULL, &si, &pi);

// чекаємо 10 секунд

Sleep(10000);

// завершуемо процес

TerminateProcess(pi.hProcess, 0);

// чекаємо завершення створеного процесу

WaitForSingleObject(pi.hProcess, INFINITE);

// закриваємо дескриптори відкритого процесу

CloseHandle(pi.hThread);

CloseHandle(pi.hProcess);

return 0;

}

Задача 2. В програмі для першого потоку написано функцію thread1, для другого – thread2. Для обміну даними з головною програмою використовуються глобальні змінні K, max_el та average.

Для ілюстрації паралельності роботи потоків, у відповідних функціях через кожні 500 елементів виводиться наступна інформація: номер потоку та кількість опрацьованих елементів масиву.

Приклад програми:

#include <windows.h>

#include <iostream>

#include <clocale>

using namespace std;

const int K = 5000; // кількість елементів масиву

int max_el; // змінна для зберігання максимального елемента масиву

float average = 0; // змінна для зберігання середнього арифметичного елементів масиву

// функція для знаходження максимального елемента масиву,

// котра буде викликана першим потоком

DWORD WINAPI thread1(void *_array)

{

int *a; // локальна змінна для зберігання масиву

a = static_cast<int *>(_array); // приведення типу void * до типу int *

// пошук максимального елемента

max_el = a[0];

for (int i = 0; i < K; ++i)

{

if (a[i] > max_el)

max_el = a[i];

// виводимо поточний стан роботи потоку

if ((i % (K/10)) == 0)

printf_s("\nПотiк 1. Опрацьовано елементiв: %i\n", i);

}

printf_s("Потiк 1 завершив роботу.\n");

return 0;

}

// функція для знаходження середнього арифметичного елементів масиву,

// котра буде викликана другим потоком

DWORD WINAPI thread2(void *_array)

{

int *a; // локальна змінна для зберігання масиву

a = static_cast<int *>(_array); // приведення типу void * до типу int *

// пошук середнього арифметичного елементів масиву

average = 0;

for (int i = 0; i < K; ++i)

{

average = average + a[i];

// виводимо поточний стан роботи потоку

if ((i % (K/10)) == 0)

printf_s("\nПотiк 2: Опрацьовано елементiв: %i\n", i);

}

average = average / K;

printf_s("Потiк 2 завершив роботу.\n");

return 0;

}

int main()

{

setlocale(LC_ALL, "Ukrainian");

HANDLE hThread1, hThread2; // дескриптори потоків

int TestArray[K];

// генеруємо масив випадкових чисел

for (int i = 0; i < K; ++i)

TestArray[i] = rand()%5000-2500;

// створюємо потік для знаходження максимального елемента масиву

hThread1 = (HANDLE) CreateThread(NULL, 0, thread1, (void *)TestArray, 0, NULL);

if (hThread1 == NULL)

return GetLastError();

// створюємо потік для знаходження середнього арифметичного елементів масиву

hThread2 = (HANDLE) CreateThread(NULL, 0, thread2, (void *)TestArray, 0, NULL);

if (hThread2 == NULL)

return GetLastError();

// чекаємо закінчення роботи першого потоку

WaitForSingleObject(hThread1, INFINITE);

// чекаємо закінчення роботи другого потоку

WaitForSingleObject(hThread2, INFINITE);

cout << "\nМаксимальний елемент масиву = " << max_el << endl;

cout << "\nСереднє арифметичне елементiв масиву = " << average << endl;

// закриваємо дескриптор потоку thread1

CloseHandle(hThread1);

// закриваємо дескриптор потоку thread2

CloseHandle(hThread2);

return 0;

}

Результат роботи програми: