遇到的多线程死循环问题

知乎地址: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)

猜你喜欢

转载自blog.csdn.net/qq_15821883/article/details/80283341