Как реализовать потоки для сортировки вектора векторов синхронно? - PullRequest
0 голосов
/ 22 января 2019

Я создаю вектор, который содержит векторы целых чисел, идея состоит в том, чтобы отсортировать каждый вектор целых чисел, вызывая сортировку пузырьков с потоками для каждого из них, а затем печатать время выполнения.

I 'Я пытаюсь реализовать поток в каждой итерации, но не работает


vector<int> bubbleSort(vector<int>);

void asynchronousSort(vector<vector<int>> pool){
    double executionTime;

    clock_t tStart = clock();
    for(int i = 0; i < pool.size(); i++){
        thread t (bubbleSort, pool[i]);
        t.join();
    }

    executionTime = (double)(clock() - tStart)/CLOCKS_PER_SEC;
    cout << "Time :" << executionTime<< "s." << endl ;
}

void synchronousSort(vector<vector<int>> pool){
    double executionTime;
    clock_t tStart = clock();

    for(int i = 0; i < pool.size(); i++){
        pool[i] = bubbleSort(pool[i]);
    }

    executionTime = (double)(clock() - tStart)/CLOCKS_PER_SEC;
    cout << "Time :" << executionTime<< "s." << endl ;
}

int main(int argc, const char * argv[]) {

    int selectMethod;
    vector<vector<int>> pool(10);
    //Create 10 lists with 10000 numbers in decrement.
    for (int i = 0; i < 10; i++) {
        vector<int> temp;
        for(int j = 10000; j > 0; j--){
            temp.push_back(j);
        }
        pool.push_back(temp);
    }

    cout << "Select method 1)Asynchronously. 2)Synchronously. (1/2): ";
    cin >> selectMethod;

    if(selectMethod == 1){
        asynchronousSort(pool);
    }else{
        synchronousSort(pool);
    }
    return 0;
}

Это заняло одинаковое время в обоих методах, когда sinchronousSort должен быть более быстрым.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вам необходимо сохранить thread s и join их после цикла.

void asynchronousSort(vector<vector<int>> pool){
    double executionTime;
    vector<thread> threads;

    clock_t tStart = clock();
    for(int i = 0; i < pool.size(); i++){
        threads.emplace_back(bubbleSort, pool[i]); // make threads directly inside the vector
                                                   // saves having to std::move them
    }
    for(thread & t:threads) // now that all the threads are up (and maybe running), join them
    {
        t.join();
    }
    // now we can get the execution time
    // note: unless pool is large you may miss it. 
    executionTime = (double)(clock() - tStart)/CLOCKS_PER_SEC;
    cout << "Time :" << executionTime<< "s." << endl ;
}

Обратите внимание, что это на самом деле не пул потоков. Пул потоков - это пул потоков, которые вы поддерживаете и назначаете задания. Это просто куча thread с. Также обратите внимание, что если пул потоков одевается в красно-черное и общается с аудиторией, у вас есть реальная проблема Обратитесь за немедленной помощью.

0 голосов
/ 22 января 2019

Если у вас есть компилятор C ++ 17, поддерживающий политики выполнения (например, VS2017), возможно использование std::for_each(std::execution::par, ....

#include <algorithm>
#include <execution>

void asynchronousSort(vector<vector<int>>& pool) {
    std::for_each(std::execution::par, pool.begin(), pool.end(), [](auto& v) {
        // used std::sort instead
        std::sort(v.begin(), v.end());
    });
}
0 голосов
/ 22 января 2019

В вашем цикле for вы ожидаете завершения потока (t.join()), поэтому одновременной сортировки нет.

for(int i = 0; i < pool.size(); i++){
        thread t (bubbleSort, pool[i]);
        t.join();
    }

Вместо этого используйте detach(), затем дождитесь всех потоков, прежде чемфункция возвращает (например, сохраняя потоки * в векторе, затем соединяя их все в цикле for).

Тем не менее, создание потока занимает время, и, следовательно, оно может быть не таким быстрым, как вы думаете, для быстрых операций.Если это для Windows, вы можете использовать мой Threadpool API класс, задокументированный здесь .

...