Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 2

#include <windows.

h>
#include <iostream>
#include <fstream>
#include <random>
#include <ctime>

using namespace std;

//Скільки чисел буде записано у файл


const int operationCount = 10;
//назва файлу
string fileName = "numbers.txt";
//семафор
HANDLE hNewDataWrittenSemaphore;

//Код що буде виконуватись у потоці А (запис чисел у файл)


DWORD WINAPI threadA(LPVOID)
{
srand(time(NULL)); // Це потрібно для того щоб при кожному запуску программи
генерувались нові числа

ofstream file(fileName); //відкриття файлового потоку для запису у файл


for (int i = 0; i < operationCount; i++)
{
//генерація випадкового дійсного числа (наприклад 8.35)
float randomNumber = (rand() % 50) * 3.25f - (rand() % 25) * 3.25f;
cout << "Thread A : write " << randomNumber << " to file" << endl << endl
<< flush;
//запис числа у файл
file << randomNumber << endl;
//збільшення лічильника у семафорі (свідчить що було записане нове число у
файл)
ReleaseSemaphore(hNewDataWrittenSemaphore, 1, NULL);
//Засинаємо потоком А на невеликий проміжок часу для того щоб переключитись
на потік Б
Sleep(100);
}
//закриття файлу
file.close();
return 0;
}

//Код що буде виконуватись у потоці Б (читання числа з файлу)


DWORD WINAPI threadB(LPVOID)
{
ifstream file;
//змінні для підрахунку кількості додатніх чисел та їх сума
float positivCount = 0;
float positivSum = 0;

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


{
//Очікуємо коли у файл буде записане нове число
WaitForSingleObject(hNewDataWrittenSemaphore, INFINITE);

//Якщо файл ще не був відкритий, відкриваємо його


if (!file.is_open())
file.open(fileName);
//Зчитуємо число з файлового потоку
float number;
file >> number;
cout << "Thread B : read " << number << " from file" << endl << flush;
//Якщо воно позитивне, змінюємо необхідні лічильники
if (number > 0)
{
positivCount++;
positivSum += number;
}
//Виводим середнє арифметичне для поточної ітерації
cout << "Thread B : average value of positiv numbers " << positivSum /
positivCount << endl << endl << flush;
}
return 0;
}

int main()
{
// створюємо семафор
hNewDataWrittenSemaphore = CreateSemaphore(NULL, 0, operationCount, NULL);
if (hNewDataWrittenSemaphore == NULL)
return GetLastError();

//Створюємо потік що записує числа у файл


DWORD IDThreadA;
HANDLE hThreadA = CreateThread(NULL, 0, threadA, NULL, 0, &IDThreadA);
if (hThreadA == NULL)
return GetLastError();

//Створюємо потік що зчитує числа з файлу


DWORD IDThreadB;
HANDLE hThreadB = CreateThread(NULL, 0, threadB, NULL, 0, &IDThreadB);
if (hThreadB == NULL)
return GetLastError();

//Засинаємо потоком що працює у функції main, для того щоб інші потоки могли
працювати
Sleep(100000);

CloseHandle(hNewDataWrittenSemaphore);
CloseHandle(hThreadA);
CloseHandle(hThreadB);
return 0;
}

You might also like