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; }
void sort_thread() { while(!end_of_data) { try_sort_chunk(); std::this_thread::yield(); } }
void sort_thread() { while (!end_of_data) { // 16 try_sort_chunk(); // 17 std::this_thread::yield(); // 18 } }