std :: queue :: empty()无法正常工作?

时间:2015-03-28 17:07:55

标签: c++ multithreading thread-safety queue mutex

我对这段代码感到很疯狂。我有一个线程定期调用此方法:

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之前添加一个额外的检查,我可以解决这个问题,但是我希望检查一次就足够了,因为我还使用了互斥锁。所以另一种选择可能是我使用互斥锁是错误的,但据我所知,这是在这种情况下使用它们的正确方法。所以我希望,如果有什么我想念的话,也许更聪明的人可以让我知道?我希望这段代码足够了,如果有必要,我可以提供更多代码,尽管没有其他功能可以触及失败的队列。

最好的问候

0 个答案:

没有答案