Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.89 KB | None | 0 0
  1. #include <pthread.h>
  2. #include <iostream>
  3. #include <vector>
  4. #include <math.h>
  5. #include <string>
  6. #include <Windows.h>
  7.  
  8. double result0;//хранит результаты работа n-го потока
  9. double result1;
  10. double result2;
  11.  
  12. class IntegralOperation //класс содержит основные поля и методы для работы с интегралами
  13. {
  14.  
  15. double a_;
  16. double b_;
  17. int stepsqty_;
  18. double step_;
  19. double result_;
  20.  
  21. public:
  22.  
  23. IntegralOperation(double a, double b, int steps) :a_(a), b_(b), stepsqty_(steps)
  24. {
  25. result_ = 0;
  26. step_ = (b - a) / steps;
  27. }
  28.  
  29. double f(double x)
  30. {
  31. double y;
  32. y = ( 2 * x );//формула по которой ищем интеграл
  33. return(y);
  34. }
  35.  
  36. double checkIntegral(int numThread)//находим интеграл
  37. {
  38. double secondResult = 0;
  39. if (numThread == 0)
  40. {
  41. secondResult += f(a_) + f(b_);
  42. return secondResult;
  43. }
  44.  
  45. for (int i = 1; i < stepsqty_; i++)
  46. {
  47. if ((i % 2 == 0) && (numThread == 2))
  48. {
  49. secondResult += (f(a_ + (i * step_))) * 2;
  50. }
  51. else if (numThread == 1)
  52. {
  53. secondResult += (f(a_ + (i * step_))) * 4;
  54. }
  55. }
  56. return secondResult;
  57. }
  58.  
  59.  
  60. double getIntegral()
  61. {
  62. result_ += (result1 + result0 + result2);
  63. result_ /= 3;
  64. return(result_);
  65. }
  66.  
  67. };
  68.  
  69. struct IntegralNum
  70. {
  71. IntegralOperation integral_;
  72. int numThread_;
  73.  
  74. IntegralNum(IntegralOperation integral, int num) :integral_(integral), numThread_(num) {};
  75. };
  76.  
  77. void* CalculationIntegral(void* arg)//основная функция выполняемая в потоках
  78. {
  79. IntegralNum *firstIntegralNum = (IntegralNum*)arg;
  80.  
  81. if (firstIntegralNum->numThread_ == 0)
  82. {
  83. result0=firstIntegralNum->integral_.checkIntegral(firstIntegralNum->numThread_);
  84. }else
  85. if (firstIntegralNum->numThread_ == 1)
  86. {
  87. result1=firstIntegralNum->integral_.checkIntegral(firstIntegralNum->numThread_);
  88. }
  89. if (firstIntegralNum->numThread_ == 2)
  90. {
  91. result2 = firstIntegralNum->integral_.checkIntegral(firstIntegralNum->numThread_);
  92. }
  93. return(0);
  94. }
  95.  
  96. void main()
  97. {
  98. IntegralOperation integral(1, 3, 2);
  99. std::vector <IntegralNum> integralnum;
  100. std::vector <pthread_t> myThreads;//создаем вектор c id потоков
  101. myThreads.resize(3);
  102.  
  103. result0 = 0;
  104. result1 = 0;
  105. result2 = 0;
  106. for (int i = 0; i < 3; i++)//создаем структуры для передачи в поток
  107. {
  108. integralnum.push_back(IntegralNum(integral, i));
  109. }
  110.  
  111. for (int i = 0; i < 3; i++)//создание потоков
  112. {
  113. pthread_create(&myThreads[i], NULL, CalculationIntegral, &integralnum[i]);
  114. }
  115.  
  116. for (int i = 0; i < 3; i++)//ожидание завершения потоков
  117. {
  118. pthread_join(myThreads[i], NULL);
  119. }
  120.  
  121. std::cout << "result: " << integral.getIntegral() << std::endl << std::endl;//вывод результата
  122.  
  123. system("pause");
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement