多线程场景下QList的[]运算符崩溃、at()方法正常运行的原因咨询
QList
at() 与 operator[] 多线程下行为差异原因 - 两个接口的底层实现逻辑不同:
at()是Qt专门设计的只读访问接口,返回const类型的元素引用,调用过程只会读取容器内部的共享数据块,不会修改容器的引用计数,也不会触发隐式共享的深拷贝逻辑,全程仅执行读操作。operator[]提供可写访问能力,当调用非const版本的[]运算符时,Qt会检查当前容器的数据块是否被多个对象共享,如果处于共享状态会自动触发深拷贝,重新分配独立的数据块给当前容器使用,这个过程包含内存重分配、引用计数修改等写操作。
- 多线程数据竞争是崩溃的直接原因:
- QList本身不具备线程安全属性,多个线程同时对同一个QList实例执行写操作、或者读写并行时会触发数据竞争。
- 你的运行场景中大概率存在其他线程同时操作该
myList实例的情况:调用at()时全程仅读,刚好没有触发临界区冲突,所以可以正常运行;调用operator[]时触发了深拷贝写操作,和其他线程的操作产生了内存访问冲突,最终导致程序崩溃。
- 补充说明:
at()能正常运行仅为当前场景下的偶然现象,不代表at()是线程安全的。如果有其他线程同时修改容器结构、或者删除元素导致下标越界,at()同样会出现运行异常,只是它本身不会主动触发写操作,所以出现数据竞争的概率更低。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

