c++ - 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_sort
and 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)
解决方案
推荐阅读
- mysql - Mysql我如何对两个表进行sql并从第二个开始计算groupid
- java - flink 是否在批处理模式下即时减少
- java - 如何预测 StackOverFlow?
- api - Salesforce Analytics API 运行用户
- python - 当 parse_dates 失败时,熊猫会掉行
- python - 如何通过 selenium python 从所有页面获取数据
- php - 添加额外的身份验证变量表单用户表社区身份验证
- css - 观察所有 sass 文件的变化并将它们保存在一个 css 文件中
- python - Scipy.stats 的 fit 和 pdf 函数
- node.js - Docker 中的 Azure Node.js 应用服务避免无法打开 /dev/tty 日志