Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <ctime>
- #include <iostream>
- #include <pthread.h>
- //promasterden@yandex.ru
- //данная программа работает с помощью 2-х потоков
- /*идея следующая: я буду использовать функции merge не только с начала,
- но еще и с конца, именно по этому нам нужно 2 потока(естественно эти 2 функции должны работать одновременно*/
- struct Data {
- int* a; //массив а
- int* b; //массив b
- int n; //размер массива a
- int m; //размер массива b
- int iteration;
- };
- int* c; //итоговый массив с
- //задаем длину массивов
- void read_array_size(int& n, int& m)
- {
- std::cout << "Set lenght of first array: ";
- std::cin >> n;
- std::cout << "Set lenght of second array: ";
- std::cin >> m;
- }
- //создание отсортированных массивов
- void create_arrays(int* a, int* b, int n, int m) {
- for (int i = 0; i < n; ++i)
- {
- a[i] = std::rand() % 10000;
- }
- for (int i = 0; i < m; ++i)
- {
- b[i] = std::rand() % 10000;
- }
- //отсортируем массивы a и b(из библиотеки algorithm)
- std::sort(a, a + n);
- std::sort(b, b + m);
- }
- //вывод массивов а и b
- void out_arrays(int* a, int* b, int n, int m) {
- for (int i = 0; i < n; ++i)
- std::cout << a[i] << ' ';
- std::cout << "\n";
- for (int i = 0; i < m; ++i)
- std::cout << b[i] << ' ';
- std::cout << "\n";
- }
- //функция merging будет сливать массивы в массив с (с начала)
- //в качестве аругемнтов эта функция принимает указатель на структуру
- void merging(struct Data* str) {
- int* start_it = c;
- int to = (str->n + str->m) / 2;
- while(str->a && str->b && to) {
- if (*str->a <= *str->b)
- *start_it++ = *str->a++;
- else
- *start_it++ = *str->b++;
- --to;
- }
- while (str->a && to) {
- *start_it++ = *str->a++;
- --to;
- }
- while (str->b && to) {
- *start_it++ = *str->b++;
- --to;
- }
- }
- //функция merging будет сливать массивы в массив с (с конца)
- //в качестве аругемнтов эта функция принимает указатель на структуру
- void reverse_merging(struct Data* str) {
- int* start_it = c + str->n + str->m - 1;
- int to = (str->n + str->m) / 2 + (str->n + str->m) % 2;
- int* end_a = str->a - 1;
- int* end_b = str->b - 1;
- str->a += str->n - 1;
- str->b += str->m - 1;
- while(str->a != end_a && str->b != end_b && to) {
- if (*str->a >= *str->b)
- *start_it-- = *str->a--;
- else
- *start_it-- = *str->b--;
- --to;
- }
- while (str->a != end_a && to) {
- *start_it-- = *str->a--;
- --to;
- }
- while (str->b && to) {
- *start_it-- = *str->b--;
- --to;
- }
- }
- //эта функция выполняется в новом потоке
- //в качестве аругемнтов эта функция принимает указатель на структуру
- void* merging(void* data)
- {
- Data* str = (Data*) data;
- if (!str->iteration) //если итерация = 0 то merging иначе reverse_merging
- merging(str);
- else
- reverse_merging(str);
- delete str;
- }
- int main()
- {
- std::srand(time(NULL)); //эта команда для того, чтобы при каждой компиляции генерировались разные значения(из библиотеки ctime)
- int n, m;
- read_array_size(n, m);
- int *a = new int[n];
- int *b = new int[m];
- c = new int[n + m]; //создаем массив c длины n + m
- create_arrays(a, b, n, m); //создаем массивы а и b
- out_arrays(a, b, n, m); //выводим массивы а и b
- pthread_t threads[2];
- for (int i = 0; i < 2; ++i) {
- Data *data = new Data();
- data->a = a;
- data->b = b;
- data->n = n;
- data->m = m;
- data->iteration = i;
- pthread_create(&threads[i], NULL, merging, data); /*функция получает указатель на поток, переменную типа pthread_t,
- далее передаем функцию, которая будет выполняться в новом потоке, ну и передаем указатель на нашу структуру.
- */
- }
- for (int i = 0; i < 2; ++i)
- pthread_join(threads[i], NULL); /*эта команда нужна для того, чтобы успели завершиться все наши потоки,
- а уже потом выполнялась дальнейшая часть.*/
- for (int i = 0; i < n + m; ++i)
- std::cout << c[i] << ' ';
- delete[] a;
- delete[] b;
- delete[] c;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement