В этом подпункте описаны классы, которые являются execution policy типами. Объект типа политики выполнения указывает виды параллелизма, разрешенные при выполнении алгоритма, и выражает соответствующие требования к функциям доступа к элементам. [ Example:
using namespace std; vector<int> v = /* ... */; // standard sequential sort sort(v.begin(), v.end()); // explicitly sequential sort sort(execution::seq, v.begin(), v.end()); // permitting parallel execution sort(execution::par, v.begin(), v.end()); // permitting vectorization as well sort(execution::par_unseq, v.begin(), v.end());
— end example ] [ Note: Поскольку разные параллельные архитектуры могут требовать идиосинкразических параметров для эффективного выполнения, реализации могут предоставлять дополнительные политики выполнения к тем, которые описаны в этом стандарте как расширения. ] — end note
namespace std { // [execpol.type], execution policy type trait template<class T> struct is_execution_policy; template<class T> inline constexpr bool is_execution_policy_v = is_execution_policy<T>::value; } namespace std::execution { // [execpol.seq], sequenced execution policy class sequenced_policy; // [execpol.par], parallel execution policy class parallel_policy; // [execpol.parunseq], parallel and unsequenced execution policy class parallel_unsequenced_policy; // [execpol.objects], execution policy objects inline constexpr sequenced_policy seq{ unspecified }; inline constexpr parallel_policy par{ unspecified }; inline constexpr parallel_unsequenced_policy par_unseq{ unspecified }; }
template<class T> struct is_execution_policy { see below };
is_execution_policy может использоваться для обнаружения политик выполнения с целью исключения сигнатур функций из неоднозначного участия в разрешении перегрузки.
is_execution_policy<T> должен быть UnaryTypeTrait с базовой характеристикой, в true_type противном случае if T является типом стандартной или определяемой реализацией политики выполнения false_type.
[ Note: Это положение оставляет за реализацией библиотеки право создавать нестандартные политики выполнения. ] — end note
class execution::sequenced_policy { unspecified };
Класс execution::sequenced_policy - это тип политики выполнения, используемый как уникальный тип для устранения неоднозначности перегрузки параллельного алгоритма и требует, чтобы выполнение параллельного алгоритма не могло быть распараллелено.
class execution::parallel_policy { unspecified };
Класс execution::parallel_policy - это тип политики выполнения, используемый как уникальный тип, чтобы устранить неоднозначность перегрузки параллельного алгоритма и указать, что выполнение параллельного алгоритма может быть распараллелено.
class execution::parallel_unsequenced_policy { unspecified };
Класс execution::parallel_unsequenced_policy - это тип политики выполнения, используемый как уникальный тип для устранения неоднозначности перегрузки параллельного алгоритма и указания того, что выполнение параллельного алгоритма может быть распараллелено и векторизовано.
inline constexpr execution::sequenced_policy execution::seq{ unspecified };
inline constexpr execution::parallel_policy execution::par{ unspecified };
inline constexpr execution::parallel_unsequenced_policy execution::par_unseq{ unspecified };