template struct sorter { thread_pool pool; std::list do_sort(std::list& chunk_data) { if(chunk_data.empty()) { return chunk_data; } std::list result; result.splice(result.begin(),chunk_data,chunk_data.begin()); T const& partition_val=*result.begin(); typename std::list::iterator divide_point= std::partition( chunk_data.begin(),chunk_data.end(), [&](T const& val){return val new_lower_chunk; new_lower_chunk.splice( new_lower_chunk.end(), chunk_data,chunk_data.begin(), divide_point); thread_pool::task_handle > new_lower= pool.submit( std::bind( &sorter::do_sort,this, std::move(new_lower_chunk))); std::list new_higher(do_sort(chunk_data)); result.splice(result.end(),new_higher); while(!new_lower.is_ready()) { pool.run_pending_task(); } result.splice(result.begin(),new_lower.get()); return result; } }; template std::list parallel_quick_sort(std::list input) { if(input.empty()) { return input; } sorter s; return s.do_sort(input); }