早就听说QString是非线程安全的,以前在使用过程中也没有过多的体会,下面介绍一下自己的使用过程。
使用环境:两个程序进行通信,首先,程序A向程序发送一组请求,程序B接收到请求后,组织数据,然后发回程序A,程序A通过另一个线程(回调线程)接收程序B的数据并进行处理。
QString的使用:在程序A中使用了QString作为发向程序B的一组数据中每个数据的标示,并且以指针的方式记录在发送缓冲区中,以便在回调线程中根据QString所标示的数组,进行数据处理。
程序中的锁:为避免多线程调用的问题,采用加锁的方式保证同一时间只有一个请求过程(从请求到回调完成)。
程序表现:程序编译运行开始时还算稳定,但每次经过一段时间后便出现异常。
分析:经过堆栈分析,每次异常都出现在QString的处理中,所以判断是QString在多线程中使用造成的原因。
解决方法:将QString的内容进行转换,记录为字符数组,程序稳定。
后记:线程安全是针对多线程来讲的,如果所使用的公用变量在多线程下没有被保护机制时,变量结果会和理论值不一致,这样就叫作线程不安全,相反公用变量在保护机制下工作,就不会出现“随机”变化,这时叫线程安全。
首先,可重入和线程安全是两个并不等同的概念,一个函数可以是可重入的,也可以是线程安