ASSERT: "isDetached()"报错——多线程抢占QVector类型变量引起的问题

342 阅读1分钟

前两天调试Qt编写的程序的时候程序突然崩溃并在输出栏提示 : ASSERT: "isDetached()"in file /opt/qt5.12.2-qt-xcb/include/QtCore/qvector.h, line 386
看了一下这个qvector.h,发现程序中断在了如下代码中:

template <typename T>
void QVector<T>::detach()
{
    if (!isDetached()) {
#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
        if (!d->alloc)
            d = Data::unsharableEmpty();
        else
#endif
            reallocData(d->size, int(d->alloc));
        }
        Q_ASSERT(isDetached());
    }

这说明QVector变量在增加元素的时候,申请内存过程中被打断了。
原因是我有一个类中定义了QVector < QString > 类型的变量vLog;
然后会有多个线程调用这个类中地这个变量:

vLog.push_back("hello");

这时就造成了资源抢占。

解决方法:
在该类中定义类成员变量 QMutex m_qMutex;
然后在使用vLog的地方加锁:

m_qMutex.lock();    
vLog.push_back("hello");
m_qMutex.unlock();