首页 > 解决方案 > Boost 块间接排序分段错误

问题描述

以下是代码:

template<int N>
void para_sort(std::vector<bfs_node<N>>& res) {
    #pragma omp parallel
    {
        boost::sort::block_indirect_sort(res.begin(), res.end(), compare_node<N>);
    }
}

仅使用一个 OMP 线程运行时,代码运行时没有任何异常。但是,代码在使用多个线程运行时会引发异常。

该代码在使用时可以与多个线程一起正常工作Boost::Parallel_stable_sort

我怀疑是严格的弱排序要求导致它引发异常。但在这种情况下,它应该用parallel_stable_sortand std::sort(顺序版本)提出。

boost::block_indirect_sort要求更严格还是更弱的排序约束?

template<int N>
bool compare_node(const bfs_node<N>& lhs, const bfs_node<N>& rhs) {
    if (lhs.id == rhs.id) return false;
    for (int i = 0; i < N * 64; ++i) {
        bool lflag = in_set(lhs.id, i);
        bool rflag = in_set(rhs.id, i);
        if (lflag == rflag ) { continue; }
        if (lflag) return true;
        return false;
    }
    return false;
} // 

这里id的字段表示一个unordered_set类型数据结构。例如:id表示集合{1,2,3} 并将in_set(id, 1) 返回true,否则false

引发异常: Invalid read of size 16 ==2125== at 0x46C59F: void boost::sort::pdqsort_detail::pdqsort_loop<__gnu_cxx::__normal_iterator<bfs_node<1>*, std::vector<bfs_node<1>, std::allocator<bfs_node<1> > > >, std::less<bfs_node<1> >, false>(__gnu_cxx::__normal_iterator<bfs_node<1>*, std::vector<bfs_node<1>, std::allocator<bfs_node<1> > > >, __gnu_cxx::__normal_iterator<bfs_node<1>*, std::vector<bfs_node<1>, std::allocator<bfs_node<1> > > >, std::less<bfs_node<1> >, int, bool)

标签: c++sortingc++11boostparallel-processing

解决方案


推荐阅读