在线程中访问vector.front()会导致运行时错误

时间:2014-04-24 14:12:13

标签: c++ multithreading vector

我有一个奇怪的向量问题,我在主线程中初始化一个类成员向量,然后调用一个试图访问该向量的 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

2 个答案:

答案 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来诊断问题。