将 std::sort 与并行执行策略一起使用时,我必须考虑啥?

Posted

技术标签:

【中文标题】将 std::sort 与并行执行策略一起使用时,我必须考虑啥?【英文标题】:What do I have to consider when using std::sort with a parallel execution policy?将 std::sort 与并行执行策略一起使用时,我必须考虑什么? 【发布时间】:2021-05-11 13:58:40 【问题描述】:

使用 C++17,我们得到了执行策略。 我对parallel policies感兴趣

当我将std::sort 与并行策略一起使用时,我必须考虑什么? 与std::transformstd::for_each 不同,std::sort 同时访问两个元素。我必须在这里考虑数据竞争吗?

【问题讨论】:

排序和任何有效的排序函数都不应该修改被排序的容器的值。所以std::sort 真的不需要自己做任何同步。话虽如此,如果您有其他线程可以在std::sort 运行时修改容器或其存储的值,那么这是另一回事,但这不是std::sort 可以防止的。您有责任防止此类情况发生。 @SomeProgrammerDude 这可能是语言障碍,但看到断言“sort [...] 应该 [not] 修改被排序容器的值”。好吧,它显然修改了它们,因为它交换了它们,这改变了正在交换的对象。虽然我相信我得到了你想要传达的内容:) 【参考方案1】:

在使用执行策略调用 std::sort 时,没有任何额外需要考虑。它已经是 UB 供您比较来改变它正在比较的元素。

需要实现以确保在std 中定义的任何函数中都没有数据竞争。

【讨论】:

以上是关于将 std::sort 与并行执行策略一起使用时,我必须考虑啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 std::sort() 与 std::unique_ptr<[]> 一起使用?

std::sort 使用继承的仿函数

为啥将 std::sort 与自定义比较器一起使用无法编译?

如何参数化标准库算法的执行策略? [复制]

我可以将 MPI 与共享内存一起使用吗

混淆使用 std::less 和 std::greater 与 std::sort