文章目录

  • ​​0 背景​​
  • ​​1 问题分析与解决​​

0 背景

因为项目需要处理TCP传来的特别快的数据,每秒600次,核算差不多1.6ms一次,如果单用一个主线程来处理特别容易卡死(因为虽然主线程接受数据很快,但是处理数据就会特别慢(相较与接受数据),就会导致来不及接受接下来的数据),因此需要用到多线程来处理。

1 问题分析与解决

主线程接受数据,其余线程用于处理数据并把结果返回给出线程。由于用到​​moveToThread​​的方法来创建和管理线程,因此会涉及到多个不同类之间进行数据交互,我选择的处理方法为使用全局变量来进行参数传递,但是这样做会遇到问题。

那就是由于主线程接收数据的处理速度一般要快于其余处理数据的线程,由于处理数据的线程每次都要用到接收数据的主线程处理后的全局变量(每次都是一一对应的),但是因为主线程和其余处理数据的线程速度问题,导致处理数据的线程用到的全局变量的值可能是主线程下一次处理后的全局变量的值,而不是本次处理后的全局变量的值,这就导致了程序出现了错误。

Qt线程处理常见问题浅谈————线程安全问题_Qt

解决方法:

把全局变量作为参数传递给处理数据的线程,这就可以使得全局变量的数据被同步了。

其他方法:

之前也曾想过使用类似​​QMutexLocker locker(&socket_mutex);​​这样的锁,但是这样可能会出现卡死的情况,就是主线程和处理数据的线程同时对数据进行访问就会卡死。