Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <pthread.h>
- #include <iostream>
- #include <vector>
- #include <math.h>
- #include <string>
- #include <Windows.h>
- double result0;//хранит результаты работа n-го потока
- double result1;
- double result2;
- class IntegralOperation //класс содержит основные поля и методы для работы с интегралами
- {
- double a_;
- double b_;
- int stepsqty_;
- double step_;
- double result_;
- public:
- IntegralOperation(double a, double b, int steps) :a_(a), b_(b), stepsqty_(steps)
- {
- result_ = 0;
- step_ = (b - a) / steps;
- }
- double f(double x)
- {
- double y;
- y = ( 2 * x );//формула по которой ищем интеграл
- return(y);
- }
- double checkIntegral(int numThread)//находим интеграл
- {
- double secondResult = 0;
- if (numThread == 0)
- {
- secondResult += f(a_) + f(b_);
- return secondResult;
- }
- for (int i = 1; i < stepsqty_; i++)
- {
- if ((i % 2 == 0) && (numThread == 2))
- {
- secondResult += (f(a_ + (i * step_))) * 2;
- }
- else if (numThread == 1)
- {
- secondResult += (f(a_ + (i * step_))) * 4;
- }
- }
- return secondResult;
- }
- double getIntegral()
- {
- result_ += (result1 + result0 + result2);
- result_ /= 3;
- return(result_);
- }
- };
- struct IntegralNum
- {
- IntegralOperation integral_;
- int numThread_;
- IntegralNum(IntegralOperation integral, int num) :integral_(integral), numThread_(num) {};
- };
- void* CalculationIntegral(void* arg)//основная функция выполняемая в потоках
- {
- IntegralNum *firstIntegralNum = (IntegralNum*)arg;
- if (firstIntegralNum->numThread_ == 0)
- {
- result0=firstIntegralNum->integral_.checkIntegral(firstIntegralNum->numThread_);
- }else
- if (firstIntegralNum->numThread_ == 1)
- {
- result1=firstIntegralNum->integral_.checkIntegral(firstIntegralNum->numThread_);
- }
- if (firstIntegralNum->numThread_ == 2)
- {
- result2 = firstIntegralNum->integral_.checkIntegral(firstIntegralNum->numThread_);
- }
- return(0);
- }
- void main()
- {
- IntegralOperation integral(1, 3, 2);
- std::vector <IntegralNum> integralnum;
- std::vector <pthread_t> myThreads;//создаем вектор c id потоков
- myThreads.resize(3);
- result0 = 0;
- result1 = 0;
- result2 = 0;
- for (int i = 0; i < 3; i++)//создаем структуры для передачи в поток
- {
- integralnum.push_back(IntegralNum(integral, i));
- }
- for (int i = 0; i < 3; i++)//создание потоков
- {
- pthread_create(&myThreads[i], NULL, CalculationIntegral, &integralnum[i]);
- }
- for (int i = 0; i < 3; i++)//ожидание завершения потоков
- {
- pthread_join(myThreads[i], NULL);
- }
- std::cout << "result: " << integral.getIntegral() << std::endl << std::endl;//вывод результата
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement