Boost块间接排序分段错误

时间:2019-05-01 20:47:54

标签: c++ sorting c++11 boost parallel-processing

以下是代码:

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_sortstd::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)

0 个答案:

没有答案