将 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::transform
或std::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<[]> 一起使用?