Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.15 KB | None | 0 0
  1. #include <algorithm>
  2. #include <ctime>
  3. #include <iostream>
  4. #include <pthread.h>
  5.  
  6. //promasterden@yandex.ru
  7. //данная программа работает с помощью 2-х потоков
  8. /*идея следующая: я буду использовать функции merge не только с начала,
  9. но еще и с конца, именно по этому нам нужно 2 потока(естественно эти 2 функции должны работать одновременно*/
  10.  
  11. struct Data {
  12. int* a; //массив а
  13. int* b; //массив b
  14. int n; //размер массива a
  15. int m; //размер массива b
  16. int iteration;
  17. };
  18.  
  19. int* c; //итоговый массив с
  20.  
  21. //задаем длину массивов
  22. void read_array_size(int& n, int& m)
  23. {
  24. std::cout << "Set lenght of first array: ";
  25. std::cin >> n;
  26. std::cout << "Set lenght of second array: ";
  27. std::cin >> m;
  28. }
  29.  
  30. //создание отсортированных массивов
  31. void create_arrays(int* a, int* b, int n, int m) {
  32. for (int i = 0; i < n; ++i)
  33. {
  34. a[i] = std::rand() % 10000;
  35. }
  36. for (int i = 0; i < m; ++i)
  37. {
  38. b[i] = std::rand() % 10000;
  39. }
  40. //отсортируем массивы a и b(из библиотеки algorithm)
  41. std::sort(a, a + n);
  42. std::sort(b, b + m);
  43. }
  44.  
  45. //вывод массивов а и b
  46. void out_arrays(int* a, int* b, int n, int m) {
  47. for (int i = 0; i < n; ++i)
  48. std::cout << a[i] << ' ';
  49. std::cout << "\n";
  50. for (int i = 0; i < m; ++i)
  51. std::cout << b[i] << ' ';
  52. std::cout << "\n";
  53. }
  54.  
  55. //функция merging будет сливать массивы в массив с (с начала)
  56. //в качестве аругемнтов эта функция принимает указатель на структуру
  57. void merging(struct Data* str) {
  58. int* start_it = c;
  59. int to = (str->n + str->m) / 2;
  60. while(str->a && str->b && to) {
  61. if (*str->a <= *str->b)
  62. *start_it++ = *str->a++;
  63. else
  64. *start_it++ = *str->b++;
  65. --to;
  66. }
  67. while (str->a && to) {
  68. *start_it++ = *str->a++;
  69. --to;
  70. }
  71. while (str->b && to) {
  72. *start_it++ = *str->b++;
  73. --to;
  74. }
  75. }
  76.  
  77. //функция merging будет сливать массивы в массив с (с конца)
  78. //в качестве аругемнтов эта функция принимает указатель на структуру
  79. void reverse_merging(struct Data* str) {
  80. int* start_it = c + str->n + str->m - 1;
  81. int to = (str->n + str->m) / 2 + (str->n + str->m) % 2;
  82. int* end_a = str->a - 1;
  83. int* end_b = str->b - 1;
  84. str->a += str->n - 1;
  85. str->b += str->m - 1;
  86. while(str->a != end_a && str->b != end_b && to) {
  87. if (*str->a >= *str->b)
  88. *start_it-- = *str->a--;
  89. else
  90. *start_it-- = *str->b--;
  91. --to;
  92. }
  93. while (str->a != end_a && to) {
  94. *start_it-- = *str->a--;
  95. --to;
  96. }
  97. while (str->b && to) {
  98. *start_it-- = *str->b--;
  99. --to;
  100. }
  101. }
  102.  
  103. //эта функция выполняется в новом потоке
  104. //в качестве аругемнтов эта функция принимает указатель на структуру
  105. void* merging(void* data)
  106. {
  107. Data* str = (Data*) data;
  108. if (!str->iteration) //если итерация = 0 то merging иначе reverse_merging
  109. merging(str);
  110. else
  111. reverse_merging(str);
  112. delete str;
  113. }
  114.  
  115. int main()
  116. {
  117. std::srand(time(NULL)); //эта команда для того, чтобы при каждой компиляции генерировались разные значения(из библиотеки ctime)
  118. int n, m;
  119. read_array_size(n, m);
  120. int *a = new int[n];
  121. int *b = new int[m];
  122. c = new int[n + m]; //создаем массив c длины n + m
  123. create_arrays(a, b, n, m); //создаем массивы а и b
  124. out_arrays(a, b, n, m); //выводим массивы а и b
  125. pthread_t threads[2];
  126. for (int i = 0; i < 2; ++i) {
  127. Data *data = new Data();
  128. data->a = a;
  129. data->b = b;
  130. data->n = n;
  131. data->m = m;
  132. data->iteration = i;
  133. pthread_create(&threads[i], NULL, merging, data); /*функция получает указатель на поток, переменную типа pthread_t,
  134. далее передаем функцию, которая будет выполняться в новом потоке, ну и передаем указатель на нашу структуру.
  135. */
  136. }
  137. for (int i = 0; i < 2; ++i)
  138. pthread_join(threads[i], NULL); /*эта команда нужна для того, чтобы успели завершиться все наши потоки,
  139. а уже потом выполнялась дальнейшая часть.*/
  140. for (int i = 0; i < n + m; ++i)
  141. std::cout << c[i] << ' ';
  142. delete[] a;
  143. delete[] b;
  144. delete[] c;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement