Ejemplo n.º 1
0
    std::list<T> do_sort(std::list<T>& chunk_data) {  // 9
        if (chunk_data.empty()) {
            return chunk_data;
        }

        std::list<T> result;
        result.splice(result.begin(), chunk_data, chunk_data.begin());
        const T& partition_val = *result.begin();

        typename std::list<T>::iterator divide_point =  // 10
            std::partition(chunk_data.begin(), chunk_data.end(),
                           [&](const T& val) { return val < partition_val; });

        chunk_to_sort new_lower_chunk;
        new_lower_chunk.data.splice(new_lower_chunk.data.end(), chunk_data,
                                    chunk_data.begin(), divide_point);

        std::future<std::list<T>> new_lower =
            new_lower_chunk.promises.get_future();
        chunks.push(std::move(new_lower_chunk));  // 11
        if (threads.size() < max_thread_count) {  // 12
            threads.push_back(std::thread(&sorter<T>::sort_thread, this));
        }

        std::list<T> new_higher(do_sort(chunk_data));

        result.splice(result.end(), new_higher);
        while (new_lower.wait_for(std::chrono::seconds(0)) !=
               std::future_status::ready) {  // 13
            try_sort_chunk();                // 14
        }
        result.splice(result.begin(), new_lower.get());
        return result;
    }
Ejemplo n.º 2
0
Archivo: 2.cpp Proyecto: gameworld/cpp
 void sort_thread()
 {
     while(!end_of_data)
     {
         try_sort_chunk();
         std::this_thread::yield();
     }
 }
Ejemplo n.º 3
0
 void sort_thread() {
     while (!end_of_data) {          // 16
         try_sort_chunk();           // 17
         std::this_thread::yield();  // 18
     }
 }