c++ SIGABRT在新线程上



我试图在解析器类内并行化方法。由于这种方法需要共享互斥锁,所以我不能使用OpenMP,因此不得不使用标准库。

我目前正在使用c++ 17,这里是不能工作的主要代码:

auto p = Parser(.7);
int tMax = thread::hardware_concurrency();
vector<thread> threads;
int chunk = (int)lines.size() / tMax;
for (int i = 0; i < tMax; ++i) {
       int start = chunk * i;
       threads.emplace_back(&Parser::parse, &p,lines, start, i);
}

问题是,我得到一个SIGABRT在创建一个新的线程,我不能找出这个原因。

你可以在这里找到完整/混乱的代码。如果你想深入研究它,我将留下一个重要行的简短列表:

  • 32-110:辅助对象定义
  • 112:开始解析器定义
  • 335年
  • : 解析方法定义
  • 主要
  • 424: (参考代码为443)

我寻找了类似的案例(像这个),但我仍然不明白到底发生了什么,为什么。

调试只引导我到线程构造函数和汇编代码,直到它到达终止异常抛出器。

我想我可能把地址和引用弄乱了,因为我传递的是对象本身,但我没有足够的c++经验来确定。

我还应该提到,这个函数在主线程中调用时工作得很好,但是在创建第二个线程时,它似乎会抛出SIGABRT。

编辑:
最小化/清洁示例可以在这里找到。

您正在创建线程的vector,然后立即退出main,而不等待它们中的任何一个完成执行。这将导致它们崩溃。

for(auto& t : threads) t.join();添加到main的末尾以等待所有线程在我的测试中工作。

最新更新