2021-8-25 使用atomic就行了
知乎地址:https://www.zhihu.com/question/276724572/answer/388777540(提问者是本人)
1、当时根据需求实现的,循环队列,读写操作不加锁
2、状态:0(操作中,不能被读写) 1(可读可写) -1(可写不可读)
3、写先行,,读永远读写-1,数据仅仅可以被读一次,没读过的数据是可写的
4、读阻塞,必须读到一个 可读数据 才可以返回
5、现象 :debug OK,release下 函数readQueue 下的while死循环了
void eQueue::readQueue(void **buff)
{
int read = ((m_nWirte + MAX_NUB - 1) % MAX_NUB);
while (m_qImage[read]->bRead != 1)
{
//Sleep(0.2);
read = ((m_nWirte + MAX_NUB - 1) % MAX_NUB);
}
// Release, not perform
// Debug or Release add Sleep code,OK
if (m_fpRead.isOpen())
{
m_fpRead.write(" start Read");
}
}
void eQueue::writeQueue(QImage & image)
{
int nWrite = m_nWirte;
//写线程需要不断去写
while (true)
{
if (m_fpWrite.isOpen())
{
QString qsMsg = QString("m_nWirte: %1, m_nRead: %2, bRead:%3 ,%4\n").arg(nWrite).arg(m_nRead).arg(m_qImage[nWrite]->bRead).arg(QDateTime::currentDateTime().toString("hh:mm:ss-zzz"));
m_fpWrite.write(qsMsg.toLatin1(), qsMsg.length());
}
if (m_qImage[nWrite]->bRead == -1)
{
*m_qImage[nWrite]->qImage = image;
m_nWirte = (nWrite + 1) % MAX_NUB;
m_qImage[nWrite]->bRead = 1;
return;
}
else
{
nWrite = (nWrite + 1) % MAX_NUB;
}
}
post下知乎大佬给的解释,经过测试确实是这样的
解决方法:1、volatile int m_nWirte;//共享变量 需要添加语义
2、加上线程等待(sleep or wait)