23 General utilities library [utilities]

23.19 Execution policies [execpol]

23.19.1 In general [execpol.general]

В этом подпункте описаны классы, которые являются 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

23.19.2 Header <execution> synopsis [execution.syn]

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 };
}

23.19.3 Execution policy type trait [execpol.type]

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

Поведение программы, добавляющей специализации, is_­execution_­policy не определено.

23.19.4 Sequenced execution policy [execpol.seq]

class execution::sequenced_policy { unspecified };

Класс execution​::​sequenced_­policy - это тип политики выполнения, используемый как уникальный тип для устранения неоднозначности перегрузки параллельного алгоритма и требует, чтобы выполнение параллельного алгоритма не могло быть распараллелено.

Во время выполнения параллельного алгоритма с execution​::​sequenced_­policy политикой, если вызов функции доступа к элементу завершается через неперехваченное исключение, terminate() должен быть вызван.

23.19.5 Parallel execution policy [execpol.par]

class execution::parallel_policy { unspecified };

Класс execution​::​parallel_­policy - это тип политики выполнения, используемый как уникальный тип, чтобы устранить неоднозначность перегрузки параллельного алгоритма и указать, что выполнение параллельного алгоритма может быть распараллелено.

Во время выполнения параллельного алгоритма с execution​::​parallel_­policy политикой, если вызов функции доступа к элементу завершается через неперехваченное исключение, terminate() должен быть вызван.

23.19.6 Parallel and unsequenced execution policy [execpol.parunseq]

class execution::parallel_unsequenced_policy { unspecified };

Класс execution​::​parallel_­unsequenced_­policy - это тип политики выполнения, используемый как уникальный тип для устранения неоднозначности перегрузки параллельного алгоритма и указания того, что выполнение параллельного алгоритма может быть распараллелено и векторизовано.

Во время выполнения параллельного алгоритма с execution​::​parallel_­unsequenced_­policy политикой, если вызов функции доступа к элементу завершается через неперехваченное исключение, terminate() должен быть вызван.

23.19.7 Execution policy objects [execpol.objects]

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 };

В заголовке <execution> объявляются глобальные объекты, связанные с каждым типом политики выполнения.