我对这段代码感到很疯狂。我有一个线程定期调用此方法:
void deliverMsgQ() {
if(delMsgQ_mutex.try_lock() == false){
return;
}
while(delMsgQ.empty() == false){
std::vector<unsigned char> v = delMsgQ.front();
delMsgQ.pop();
}
delMsgQ_mutex.unlock();
}
void processInMsgQ() {
if(inMsgQ_mutex.try_lock()){
if(delMsgQ_mutex.try_lock() == false){
inMsgQ_mutex.unlock();
}
}else{
return;
}
while(!inMsgQ.empty()){
std::vector<unsigned char> msg;
inMsgQ.front()->getData(msg);
std::cout << "Adding to del-msg-q: " << msg.size() << std::endl;
delMsgQ.push(msg);
delete inMsgQ.front();
inMsgQ.pop();
}
inMsgQ_mutex.unlock();
delMsgQ_mutex.unlock();
}
我有另一个线程也定期将向量推送到队列。这两个线程是唯一触及队列delMsgQ
的线程。
我的问题出现在第一个发布的函数中,由于某种原因,delMsgQ.empty()
在某些时候返回false,即使它没有向量,因此我最终调用pop两次。这导致大小函数变成一个巨大的不切实际的数字,然后程序进入分段错误。如果我在调用pop之前添加一个额外的检查,我可以解决这个问题,但是我希望检查一次就足够了,因为我还使用了互斥锁。所以另一种选择可能是我使用互斥锁是错误的,但据我所知,这是在这种情况下使用它们的正确方法。所以我希望,如果有什么我想念的话,也许更聪明的人可以让我知道?我希望这段代码足够了,如果有必要,我可以提供更多代码,尽管没有其他功能可以触及失败的队列。
最好的问候