parallel_for_each Body のセマンティクスと要件#
説明#
このページでは、tbb::parallel_for_each アルゴリズム仕様の ParallelForEachBody という名前の要件を明確にします。
namespace oneapi {
namespace tbb {
template <typaname InputIterator, typename Body>
void parallel_for_each( InputIterator first, InputIterator last, Body body ); // overload (1)
template <typename InputIterator, typename Body>
void parallel_for_each( InputIterator first, InputIterator last, Body body, task_group_context& group ); // overload (2)
template <typename Container, typename Body>
void parallel_for_each( Container& c, Body body ); // overload (3)
template <typename Container, typename Body>
void parallel_for_each( Container& c, Body body, task_group_context& group ); // overload (4)
template <typename Container, typename Body>
void parallel_for_each( const Container& c, Body body ); // overload (5)
template <typename Container, typename Body>
void parallel_for_each( const Container& c, Body body, task_group_context& group ); // overload (6)
} // namespace tbb
} // namespace oneapi用語
Iteratorは、parallel_for_eachアルゴリズムに渡されるイテレータのタイプを決定します(オーバーロード(1) と (2) の場合はInputIterator、オーバーロード (3) - (6) の場合はdecltype(std::begin(c))value_type-typename std::iterator_traits<iterator>::value_typeタイプreference-typename std::iterator_traits<iterator>::referenceタイプ。
異なるイテレーター・タイプの要件#
Iterator が [input.iterators] ISO C++ 標準セクションの入力イテレーターの名前付き要件を満たし、[forward.iterators] ISO C++ 標準セクションの順方向イテレーターの名前付き要件を満たしていない場合、tbb::parallel_for_each では、const value_type& または value_type&& タイプのオブジェクトを含む Body の実行が適切に行われる必要があります。両方の形式が適切である場合、rvalue 参照によるオーバーロードが優先されます。
警告
Body が value_type への非 const lvalue 参照のみを受け取る場合、上記の要件に違反するためプログラムは正しく形成されない可能性があります。
イテレーターが [forward.iterators] ISO C++ 標準セクションの順方向イテレーターの名前付き要件を満たしている場合、tbb::parallel_for_each では、reference のオブジェクトを含む Body の実行が適切に行われる必要があります。
feeder 引数を持つ Body の要件#
feeder::add を介して tbb::parallel_for_each に送信された追加の要素は、rvalues としてBodyに渡されるため、Bodyの対応する実行は適切に行われる必要があります。