QList多线程调用导致异常中断 : ASSERT: “!d->ref.isShared()” in file tools\qlist.cpp, line 257
问题描述
QT程序在release模式下运行在运行过程中会随机出现闪退问题,在debug模式下运行多次发现退出时显示为异常中断,ASSERT: “!d->ref.isShared()” in file tools\qlist.cpp, line 257
解决
经检查程序后发现,某一QList在多个线程中被调用,在某次运行RemoveAt(i)时出现上述ASSERT,根据ASSERT信息怀疑是此链表在Remove需要释放内存时,正在其他线程被调用,经检查后发现确实在某一线程有对该链表的读操作而没有加锁,加锁后问题解决。
总结
之前还有段时间在纠结如果在一个线程中只是对某一共享数据进行读操作,而没有写操作是否有必要加锁,此次问题的出现说明,就算只是读操作也是要加锁的。