首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std::execution::sequenced_policy

Defined in header <execution>

class sequenced_policy { /* unspecified */ };

(1)

(since C++17)

class parallel_policy { /* unspecified */ };

(2)

(since C++17)

class parallel_unsequenced_policy { /* unspecified */ };

(3)

(since C++17)

1%29执行策略类型用作消除并行算法重载的歧义的唯一类型,并要求并行算法%27s的执行不能并行化。在此策略%28调用的并行算法中,元素访问函数的调用通常指定为std::execution::seq%29在调用线程中被不确定地排序。

2%29执行策略类型用作消除并行算法重载的歧义,并指示并行算法%27s执行可以并行化。在此策略%28调用的并行算法中,元素访问函数的调用通常指定为std::execution::par%29允许在调用线程或库隐式创建的线程中执行,以支持并行算法执行。在同一个线程中执行的任何这样的调用都是不确定地彼此排序的。

3%29执行策略类型作为唯一类型用于消除并行算法重载的歧义,并指示并行算法%27s执行可以被并行化、矢量化或迁移到线程%28,例如由父窃取调度程序%29执行。使用此策略调用的并行算法中元素访问函数的调用允许在未指定的线程中以无序的方式执行,并允许在每个线程中对彼此不排序。

在执行具有这三种执行策略的并行算法期间,如果元素访问函数的调用通过未指明的异常退出,std::terminate调用,但是实现可以定义其他的执行策略,这些策略处理异常的方式不同。

注记

当使用并行执行策略时,程序员%27s的责任是避免死锁:

二次

代码语言:javascript
复制
int a[] = {0,1};
std::vector<int> v;
std::for_each(std::execution::par, std::begin(a), std::end(a), [&](int i) {
  v.push_back(i*2+1); // Error: data race
});

二次

二次

代码语言:javascript
复制
std::atomic<int> x{0};
int a[] = {1,2};
std::for_each(std::execution::par, std::begin(a), std::end(a), [&](int) {
  x.fetch_add(1, std::memory_order_relaxed);
  while (x.load(std::memory_order_relaxed) == 1) { } // Error: assumes execution order
});

二次

二次

代码语言:javascript
复制
int x = 0;
std::mutex m;
int a[] = {1,2};
std::for_each(std::execution::par, std::begin(a), std::end(a), [&](int) {
  std::lock_guard<std::mutex> guard(m);
  ++x; // correct
});

二次

取消顺序执行策略是函数调用的唯一情况无顺序就彼此而言,这意味着它们可以交织在一起。在C++的所有其他情况下,它们是不确定顺序%28不能插入%29。因此,不允许用户分配或释放内存、获取互斥或执行任何其他向量化操作--使用此策略时不安全的操作%28向量化--不安全的函数是与另一个函数同步的函数。std::mutex::unlock同步-与下一个std::mutex::lock29%。

二次

代码语言:javascript
复制
int x = 0;
std::mutex m;
int a[] = {1,2};
std::for_each(std::execution::par_unseq, std::begin(a), std::end(a), [&](int) {
  std::lock_guard<mutex> guard(m); // Error: lock_guard constructor calls m.lock()
  ++x;
});

二次

另见

seqparpar_unseq (C++17)(C++17)(C++17)

global execution policy objects (constant)

代码语言:txt
复制
 © cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券