Qt多线程TCP编程会挂掉

先贴上代码

 void FortuneWriteThread::run()
{
    QTcpSocket tcpSocket;
    if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
        LogManagerInst << LogManager::LogDegreeType_Error << "Socket " << QString::number(socketDescriptor) << " : " << tcpSocket.errorString();
        emit error(tcpSocket.error());
        return;
    }

    tcpSocket.moveToThread(this);

    while( !m_quit && tcpSocket.state() == QAbstractSocket::ConnectedState ) {
        m_mutex.lock();
        if(m_replyList.count() == 0)
            m_replyEmptyCond.wait(&m_mutex);
        m_mutex.unlock();

 //       QByteArray head;
//        QByteArray block;

        // data to write
        while(m_replyList.count()) {
            QByteArray block = m_replyList.takeFirst();
            if(block.length() && (block.length() <= 9999)) {
                QByteArray head = "0000";
                head.append(QString::number(block.length()));
                head = head.right(4);
                block.prepend(head);
                tcpSocket.write(block);
                tcpSocket.flush();
            }
        }
    }
}

挂掉点1、当我把注释掉的
// QByteArray head;
// QByteArray block;
放开后,而把下面的head,block申明去掉后,会在
block = m_replyList.takeFirst();
这里挂掉,debug出的结果是block不可访问

挂掉点2

程序有时候会在tcpSocket.write(block);挂掉,debug不出挂掉的原因
我在if(block.length() && (block.length() <= 9999))下面的大括号里加上lock还是会挂。

挂掉点1:涉及到线程间资源访问的知知识,你虽然把线程move了,也就是你子线程要去访问你主线程中创建的变量了