我有一个奇怪的向量问题,我在主线程中初始化一个类成员向量,然后调用一个试图访问该向量的 front()的线程。但访问向量前端会导致运行时错误
以下是主要线程的代码( dispatchQueue 是类引擎的私有类成员)
dispatchQueue.push_back(TempObj);
boost::thread processThread(&Engine::initializeExecutorService, this);
processThread.start_thread();
processThread.join();
成员函数 initializeExecutorService 的代码如下( processingQueue 是私有类成员)
while (nextIterationAvailable) {
if (pendingProcess) {
processingQueue.push_back(dispatchQueue.front());
dispatchQueue.pop_back();
}
}
如果我用主线程调用 initializeExecutorService 就可以正常工作
更新
调试器报告
收到的信号:SIGSEGV(分段错误)对于程序postmaster-cpp-ng-obj,pid 13,614 您可以丢弃信号或转发信号,然后您可以继续或暂停该过程
当我尝试使用Netbeans运行时,它会报告
跑完了;分段故障;核心倾销;
使用 gdb 运行
[使用libthread_db启用线程调试]
使用主机libthread_db库" /lib/x86_64-linux-gnu/libthread_db.so.1"。
[新主题0x7ffff68e8700(LWP 13821)]
[新主题0x7ffff60e7700(LWP 13822)]
[新主题0x7ffff58e6700(LWP 13823)]
程序接收信号SIGSEGV,分段故障 [切换到线程0x7ffff60e7700(LWP 13822)]
0x00007ffff79cba1b在?? ?? ()来自/usr/lib/libboost_thread.so.1.54.0
答案 0 :(得分:1)
std::vector::front
失败。
这是一个安全的版本:
// lock dispatchQueue
if(!dispatchQueue.empty()) {
processingQueue.push_back(dispatchQueue.front());
dispatchQueue.pop_back();
}
// unlock dispatchQueue
另外使用第一个元素并删除最后一个元素看起来很可疑。
答案 1 :(得分:0)
除了Danvil的回复,我想补充说明。可能这可能有所帮助,因为一旦我在多线程应用程序中遇到类似的问题。
您还应该检查dispatchQueue状态是否有效。在我们的应用程序中,另一个线程正在删除该向量,它在代码片段下面崩溃。
if(myvector.size)
我们使用Windbg来诊断问题。