template Iterator parallel_find_impl(Iterator first,Iterator last,MatchType match, std::atomic& done) { try { unsigned long const length=std::distance(first,last); unsigned long const min_per_thread=25; if(length<(2*min_per_thread)) { for(;(first!=last) && !done.load();++first) { if(*first==match) { done=true; return first; } } return last; } else { Iterator const mid_point=first+(length/2); std::future async_result= std::async(¶llel_find_impl, mid_point,last,match,std::ref(done)); Iterator const direct_result= parallel_find_impl(first,mid_point,match,done); return (direct_result==mid_point)? async_result.get():direct_result; } } catch(...) { done=true; throw; } } template Iterator parallel_find(Iterator first,Iterator last,MatchType match) { std::atomic done(false); return parallel_find_impl(first,last,match,done); }