Форум программистов, компьютерный форум CyberForum.ru

Многопоточная сортировка: синхронизация - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В заданном массиве найти элемент, расположенный между первым нулевым и максимальным элементом http://www.cyberforum.ru/cpp-beginners/thread1696060.html
Из элементов массива А из n элементов, расположенных между первым нулевым и максимальным (в предположении, что в массиве есть положительные числа) (или максимальным и первым нулевым), сформировать новый массив. Для формирования массива С напишите функцию с использованием указателей.
C++ Сформировать массив из элементов расположенных левее минимального элемента Из отрицательных элементов массива массив X из n элементов, расположенных левее минимального элемента, сформировать новый массив. Для формирования массива С напишите функцию с использованием указателей. (на работу с указателями) http://www.cyberforum.ru/cpp-beginners/thread1696056.html
Разбитие на заголовочные файлы C++
Здравствуйте! Имеется вот такая програмка : #include "stdafx.h" #include <iostream> #include <stdio.h> using namespace std; namespace N1 { void dod() {
C++ Рассчитать в одной функции сумму и произведение значений элементов
Ввести двумерный массив размерностью 5х6(обычный не динамический и работа с ним без использования указателей). Рассчитать в одной функции сумму и произведение значений элементов произвольной строки двумерного массива. Ввод массива и исходных данных выполнить(номера строки) в функции ввода, вывод массива и результатов – в функции вывода (передача параметров по ссылке)
C++ Заменить минимальный элемент массива суммой элементов до первого нулевого http://www.cyberforum.ru/cpp-beginners/thread1696052.html
Найти сумму положительных элементов массива из N элементов, расположенных до первого нулевого элемента, заменить этой суммой минимальный элемент массива. (на возврат ссылки из функции)
C++ В указанную пользователем позицию массива вставить значение, введённое пользователем Дан массив А из n чисел. Вставьте в указанную пользователем позицию массива значение, введённое пользователем. помогите прикрепить к исходнику функции #include <iostream> #include <cstdlib> #include <ctime> int main() { srand(time(0)); const int N = 16; подробнее

Показать сообщение отдельно
mishula
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 81

Многопоточная сортировка: синхронизация - C++

27.03.2016, 15:22. Просмотров 200. Ответов 3
Метки (Все метки)

Добрый день, только начал изучать параллельное программирование и решил написать параллельную битоническую сортировку. Суть её в том, что за одну итерацию мы проходим по массиву 2 раза, первый раз переставляя 1 и 2, 3 и 4 и т.д., а второй раз переставляем 2 и 3, 4 и 5 и т.д.
Как я понимаю, нужно использовать n/2 потоков, если всего в массиве n элементов. После прохождения в первый раз массива нужно все подождать все потоки, чтобы вывести промежуточные результаты и затем сортировать со второго элемента. Но с этой синхронизацией у меня и возникли проблемы, несмотря на то, что разделяемых объектов нет и мьютексы использовать не нужно. Вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <thread>
#include <vector>
#include <iostream>
 
 
void compareAndSwap(std::vector<int> &v, int i) {
    if (v[i] > v[i + 1])//если 10 элементов сортирую, то пишет standart c++ libraries out of range
    {
        int t = v[i];
        v[i] = v[i + 1];
        v[i + 1] = t;
    }
}
class Storage {
 
    std::mutex _mu1;
public:
    Storage() {
        std::cout << "I'm created!" << std::endl;
    }
    ~Storage() {
        data.clear();
        std::cout << "I'm die!" << std::endl;
    }
    int Size() {
        return data.size();
    }
    void sort() {
        
        std::vector<std::thread>th;
        for (int k = 0; k < data.size(); ++k)
        {
 
            for (int i = 0, j = 0; i < th.size() - 1; i += 2, j++)
            {
                th.push_back(std::thread(compareAndSwap, std::ref(data), i));
                if (th[j].joinable())
                    th[j].join();
            }
                
            th.clear();
            std::cout << *this;//почему-то если написать cout<<data, то пишет, что нет оператора вывода, соотв двум операндам
            //Print(x, l);
            for (int j = 1, i = 0; j < data.size(); j += 2, i++)
            {
                th.push_back(std::thread(compareAndSwap, std::ref(data), j));
                if (th[i].joinable())
                    th[i].join();
            }
            th.clear();
            std::cout << *this;//почему-то если написать cout<<data, то пишет, что нет оператора вывода, соотв двум операндам
        }
    }
    void pushToData(int num) {
        data.push_back(num);
    }
    friend std::ostream& operator<<(std::ostream &os, Storage &st) {
        for (int i = 0; i < st.data.size(); i++){
             os<< st.data[i]<<" ";
        }
        return std::cout << std::endl;
    }
private:
    std::vector<int>data;
 
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    int x;
    Storage st;
    while (std::cin >> x) {
        st.pushToData(x);
    }
    const int size = st.Size();
    st.sort();
    std::cout << st;
    system("pause");
    
    return 0;
}
Если элементов меньше 10, то сортировка просто идет неправильно, однако если 10 и более, то выводит ошибку expression subscript out of range. Помогите, пожалуйста, решить с этим проблему и по возможности покажите, как можно бы было в моем примере один и тот же поток использовать несколько раз, так как если написать
C++
1
th[i](compareAndSwap, std::ref(data), i);
, то пишет term doesn't evaluate to a function, taking 3 arguments.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru