Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <thread>
  3. #include <condition_variable>
  4.  
  5. #define THREAD_COUNT 4
  6. #define ARRAY_SIZE 1000000
  7.  
  8. int wart = 0;
  9. std::mutex mt;
  10.  
  11. int squareFunction(int x)
  12. {
  13. return ((x * x) + 2);
  14. }
  15.  
  16. void decrease(int arg, int &x)
  17. {
  18. for (int i = 0; i < arg; ++i)
  19. {
  20. mt.lock();
  21. x -= 1;
  22. mt.unlock();
  23. }
  24. }
  25.  
  26. void increase(int arg, int &x)
  27. {
  28. for (int i = 0; i < arg; ++i)
  29. {
  30. mt.lock();
  31. x += 1;
  32. mt.unlock();
  33. }
  34. }
  35.  
  36. int* generateArray()
  37. {
  38. int *tab = new int[ARRAY_SIZE]();
  39. for (int i = 0; i < ARRAY_SIZE; i++)
  40. {
  41. tab[i] = rand() % 100000 + 1;
  42. }
  43.  
  44. tab[34251] = -10;
  45. tab[523671] = -100;
  46. return tab;
  47. }
  48.  
  49. void findMinimum(int indexOfStart, int indexOfEnd, int &minimum, int *array)
  50. {
  51. for (int i = indexOfStart; i < indexOfEnd; ++i)
  52. {
  53. mt.lock();
  54. if (minimum > array[i])
  55. {
  56. minimum = array[i];
  57. }
  58. mt.unlock();
  59. }
  60. }
  61.  
  62. void calculateIntegral(int begining, int ending, int &result)
  63. {
  64. int height = ending - begining;
  65. result += ((squareFunction(begining) + squareFunction(ending)) / 2) * height;
  66. }
  67.  
  68. int main()
  69. {
  70.  
  71. {
  72. std::thread increaseThread(increase, 1000000, std::ref(wart));
  73. std::thread decreaseThread(decrease, 1000000, std::ref(wart));
  74.  
  75. increaseThread.join();
  76. decreaseThread.join();
  77.  
  78. std::cout << "Wartosc wart z zdania pierwszego: " << wart << '\n';
  79. }
  80.  
  81.  
  82. {
  83. std::thread minimumFindingThreads[THREAD_COUNT];
  84.  
  85. int minimum = 0;
  86. int *tab = generateArray();
  87.  
  88. int startingIndex = 0;
  89. int endingIndex = ARRAY_SIZE / THREAD_COUNT;
  90. int interval = endingIndex;
  91. for (int i = 0; i < THREAD_COUNT; ++i)
  92. {
  93. minimumFindingThreads[i] = std::thread(findMinimum, startingIndex, endingIndex,
  94. std::ref(minimum), tab);
  95. startingIndex = endingIndex;
  96. endingIndex += interval;
  97. }
  98.  
  99. for (int i = 0; i < THREAD_COUNT; ++i)
  100. {
  101. minimumFindingThreads[i].join();
  102. }
  103.  
  104. std::cout << "Najmniejszy element tablicy: " << minimum << '\n';
  105. }
  106.  
  107. {
  108. int result = 0;
  109.  
  110. std::thread calculateIntegralThreads[THREAD_COUNT];
  111. int fromIntegral = 0;
  112. int toIntegral = 12 / THREAD_COUNT;
  113. int interval = toIntegral;
  114. for (int i = 0; i < THREAD_COUNT; ++i)
  115. {
  116. calculateIntegralThreads[i] = std::thread(calculateIntegral, fromIntegral, toIntegral,
  117. std::ref(result));
  118. fromIntegral += interval;
  119. toIntegral += interval;
  120. }
  121. for (int i = 0; i < THREAD_COUNT; ++i)
  122. {
  123. calculateIntegralThreads[i].join();
  124. }
  125.  
  126. std::cout << "Calka: " << result << '\n';
  127. }
  128.  
  129.  
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement