写了一个qt程序,由生产者和消费者两个线程在总控制里启动,在debug调试时有结果执行成功,但直接构建加运行后就会一直卡死,生产者结束了,但一直没有信号发出使消费者结束。真搞不懂为什么o(╥﹏╥)o
如果需要的话,我发压缩包给你。
问题出在代码没有正确地处理线程的通信。在debug状态下因为程序执行速度较慢,可能没有暴露出线程同步的问题,而直接运行程序时,线程之间的不同步就会导致程序卡死。建议检查程序中线程的同步方式是否正确,例如使用信号和槽机制、使用互斥锁等。当生产者结束时,应当发送一个信号通知消费者停止运行,避免出现一直等待的情况。需要具体分析代码实现,才能给出更具体的建议。其中一些常见的线程同步问题包括:死锁、资源竞争等。
#include "myqueue.h"
MyQueue& MyQueue::getGlobalInstance(){
static MyQueue m_instance;
return m_instance;
}
void MyQueue::stop(){
mtx.lock();
stopped=true;
mtx.unlock();
}
int MyQueue::put(const Point &p){
mtx.lock();
if(stopped){
mtx.unlock();
return -1;
}
while(m_data.size()==BUFFER_SIZE){
//等待消费者取出数据
bufferNotFull.wait(&mtx);
}
m_data.push_back(p);
// qDebug()<<m_data.size();
// qDebug()<<"生产者放入数据";
bufferNotEmpty.wakeAll();
mtx.unlock();
return 0;
}
int MyQueue::get(Point *p){
mtx.lock();
if(stopped||p==nullptr){
if(m_data.size()==0)
{
mtx.unlock();
return -1;
}
}
while(m_data.size()==0){
//等待生产者放入数据
bufferNotEmpty.wait(&mtx);
}
auto tmp=m_data.front();
m_data.pop_front();
*p=tmp;
bufferNotFull.wakeAll();
// qDebug()<<"消费者取出数据";
mtx.unlock();
return 0;
}
这是互斥锁这部分的代码,感觉找不出问题呀o(╥﹏╥)o