На встрече в Джексонвилле предложение P0024r2 эффективно использует спецификации Parallelism TS был принят в С++ 17 (черновик). Это предложение добавляет перегрузки для многих алгоритмов, принимающих аргумент политики выполнения, чтобы указать, какой тип parallelism следует учитывать. В <execution>
(20.19.2 [исполнение]) определены три политики выполнения:
-
std::execution::sequenced_policy
(20.19.4 [execpol.seq]) с объектомconstexpr
std::execution::seq
(20.19.7 [parallel.execpol.objects]), чтобы указать последовательное выполнение, подобное вызову алгоритмов без политики выполнения. -
std::execution::parallel_policy
(20.19.5 [execpol.par]) с объектомconstexpr
std::execution::par
(20.19.7 [parallel.execpol.objects]), чтобы указать выполнение алгоритмов, потенциально использующих несколько потоков. -
std::execution::parallel_unsequenced_policy
(20.19.6 [execpol.vec]) с объектомconstexpr
std::execution::par_unseq
(20.19.7 [parallel.execpol.objects]), чтобы указать выполнение алгоритмов, потенциально использующих векторное выполнение и/или множественные потоки.
Алгоритмы STL обычно принимают определяемые пользователем объекты (итераторы, объекты функций) в качестве аргументов. Каковы ограничения на пользовательские объекты, чтобы сделать их пригодными для использования с параллельными алгоритмами с использованием стандартных политик выполнения?
Например, при использовании алгоритма, как в приведенном ниже примере, каковы последствия для FwdIt
и Predicate
?
template <typename FwdIt, typename Predicate>
FwdIt call_remove_if(FwdIt begin, FwdIt end, Predicate predicate) {
return std::remove_if(std::execution::par, begin, end, predicate);
}