Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在线程中访问vector.front()会导致运行时错误_C++_Multithreading_Vector - Fatal编程技术网

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

C++ 在线程中访问vector.front()会导致运行时错误,c++,multithreading,vector,C++,Multithreading,Vector,我对向量有一个奇怪的问题,我在主线程中初始化一个类成员向量,然后调用一个试图访问该向量的front()的线程。但是访问向量前沿会导致运行时错误 以下是主线程的代码(dispatchQueue是类引擎的私有类成员) 成员函数initializeExecutorService的代码如下(processingQueue是私有类成员) 如果我用主线程调用它,initializeExecutorService工作正常 更新 调试器报告 接收到信号:邮政局长cpp ng obj程序的SIGSEGV(分段故障

我对向量有一个奇怪的问题,我在主线程中初始化一个类成员向量,然后调用一个试图访问该向量的front()的线程。但是访问向量前沿会导致运行时错误

以下是主线程的代码(dispatchQueue是类引擎的私有类成员)

成员函数initializeExecutorService的代码如下(processingQueue是私有类成员)

如果我用主线程调用它,initializeExecutorService工作正常

更新

调试器报告

接收到信号:邮政局长cpp ng obj程序的SIGSEGV(分段故障),pid 13614 您可以放弃或转发该信号,也可以继续或暂停该过程

当我尝试使用Netbeans运行时,它会报告

跑完;分段断层;堆芯倾倒

与gdb一起运行显示

[已启用使用libthread_db的线程调试]
使用主机libthread_db library“/lib/x86_64-linux-gnu/libthread_db.so.1”。
[新螺纹0x7ffff68e8700(LWP 13821)]
[新螺纹0x7ffff60e7700(LWP 13822)]
[新螺纹0x7ffff58e6700(LWP 13823)]
程序接收信号SIGSEGV,分段故障。
[切换到线程0x7ffff60e7700(LWP 13822)]
0x00007FF79CBA1B英寸??()来自/usr/lib/libboost_-thread.so.1.54.0


std::vector::front
在向量为空时失败

这是一个安全的版本:

// lock dispatchQueue
if(!dispatchQueue.empty()) {
    processingQueue.push_back(dispatchQueue.front());
    dispatchQueue.pop_back();
}
// unlock dispatchQueue

另外,使用第一个元素并删除最后一个元素看起来很可疑。

除了Danvil的回答之外,我想补充一点。这可能会有所帮助,因为我曾经在多线程应用程序中遇到过类似的问题

您还应该检查dispatchQueue状态是否有效。在我们的应用程序中,另一个线程正在删除向量,它在代码段下面崩溃

if(myvector.size)

我们已使用Windbg诊断该问题。

请编辑您的帖子并添加确切的错误。可能不相关,但您的代码位于队列的前端,但会弹出后端?那么
pendingProcess
是如何同步的?第一个
front
调用崩溃吗?或者在崩溃发生之前,循环是否有多次迭代?不管怎么说,这看起来像是一个逻辑错误,你应该认真考虑一下。如果向量有多个条目,那么您可能删除了错误的条目。在没有SSCE的情况下,我们真正能告诉您的是,您可能在某个地方存在数据竞争(程序工作时是单线程的,崩溃时是多线程的)或者您认为
nextIterationAvailable&&pendingProcess
意味着
的逻辑错误!dispatchQueue.empty()
。实际上,在检查dispatchQueue是否为空之前不锁定它是不安全的。此外,我知道dispatchQueue不是空的,而且当调用此代码时,它永远不会是空的,因为标志PendingProcessAdditional使用第一个元素并删除最后一个元素看起来很可疑。在任何时候,向量中只有一个项,所以第一个和最后一个项是same@Kami:1)它最初不是线程安全的。2) 那么为什么需要/使用队列呢?1)我不需要线程安全,因为我不会同时更改dispatchQueue 2)它不是队列,而是向量队列,没有push_-back和pop_-back函数,它们只是push和pop
// lock dispatchQueue
if(!dispatchQueue.empty()) {
    processingQueue.push_back(dispatchQueue.front());
    dispatchQueue.pop_back();
}
// unlock dispatchQueue
if(myvector.size)