Professional Documents
Culture Documents
трс 1.1
трс 1.1
Ім'я: Павло
Група: КН-309
Варіант: 5
Інститут: ІКНІ
Кафедра: САПР
Дисципліна: Технології розподілених систем та паралельних обчислень
Перевірив:Фармага І.В.
ЗВІТ
до лабораторної роботи №1
на тему “Частина 1: Багатопотоковість”
Індивідуальне завдання:
Варіант 5. Програма моделює обслуговування одного потоку процесів декількома
центральними процесорами комп'ютера без черг. Якщо процес згенерував в той момент,
коли перший процесор зайнятий, процес береться на обробку другим процесором, якщо і цей
процесор зайнятий, запускається третій процесор і т.д. Визначити кількість задіяних
процесорів і відсоток від загальної кількості процесів, які були оброблені кожним
процесором.
Хід роботи:
Код програми:
#include <iostream>
#include<thread>
#include<mutex>
#include<vector>
#include<random>
#include<fstream>
#define NUM_OF_THREAD 8
#define NUM_OF_PROCESS 10
#define MAX_RANDOM 2000
#define TIME_BETWEEN_PROCESS_GENERATING chrono::milliseconds(300)
#define TIME_TO_FINISH_PROCESS chrono::milliseconds(800)
using namespace std;
class MyThread;
class Random
{
public:
void get_random_number(bool& active,int& id)
{
active=true;
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distr(0, MAX_RANDOM);
this_thread::sleep_for(TIME_TO_FINISH_PROCESS);
cout<<"Generated random int: "<<distr(gen)<<endl;
cout.flush();
active=false;
}
};
class MyThread
{
public:
thread t;
bool active;
int id;
int iteration_number;
Random random;
MyThread(int id)
{
this->id=id;
active=false;
iteration_number=0;
}
void new_thread()
{
iteration_number++;
t = std::thread{&Random::get_random_number,random,ref(active),ref(id)};
t.detach();
}
};
int main() {
vector<MyThread> t;
clock_t begin=clock();
for(int i=0;i<NUM_OF_THREAD;i++)
{
MyThread t1(i+1);
t.push_back(move(t1));
}
for(int i=0;i<NUM_OF_PROCESS;i++)
{
for(int j=0;j<NUM_OF_THREAD;j++)
{
if(!t[j].active)
{
t[j].new_thread();
this_thread::sleep_for(TIME_BETWEEN_PROCESS_GENERATING);
break;
}
}
}
this_thread::sleep_for(chrono::seconds(2));
for(int i=0;i<t.size();i++)
{
cout<<"Processor # "<<t[i].id<<" done "<<t[i].iteration_number<<" task
"<<"This is
"<<(static_cast<double>(t[i].iteration_number)/NUM_OF_PROCESS)*100<<"%"<<endl;
}
return 0;
}
Результат виконання: