以下是代码:
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_sort
和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)