QT环境下,POSIX多线程全局变量共享问题
开始的技术路线是:
⾸先有两个主线程:
  1,gui线程
  2,等待客户端socket连接⽤的,listen线程
  (当有客户端连接时,即creat⼀个新的线程2⽤来跟客户端通信,再来新的客户端,继续creat新的work线程3⽤于通信,以此类推,⽬前最多可以creat5个线程,即可以同时跟5台客户端通信,设置了监听的socket服务器最多监听5个队列。线程2继续listen)
出现的问题是:
  ⽤来通信的work线程3,收到⼀个来⾃客户端的xml⽂件,然后解析⽂件,并将其数据放在⼀个全局的静态struct数组⾥。数据正常,线程2和线程3均可以看到已经更新的数据值。但是,
  当gui线程去访问时,发现数据并没有更新到其线程,在gui线程下改变该全局变量的数值,也并没有更新到线程2和3,不知何解?
⼀博主,有如此解释:
不过,问题并没有清晰化。
想到的解决⽅案暂时有两种:
  1,不在work线程⾥⾯解析数据,直接在gui线程⾥⾯解析数据。
  2,采⽤
(此处出现过,⼩插曲:QT的变量查看器,在调试时不太稳定,更新过后的值在窗⼝中查看,并没有得到及时更新,需要通过程序判定验证!)
另外的问题是:⼀个变量在多线程环境下,它们的地址都是不同的,为什么呢?待解! 
由于程序需要在线程创建之后必须返回到gui主线程,所以采⽤创建两次线程的⽅式:创建线程A,返回,然后在线程A⾥⾯创建
在多线程POSIX标准下,主线程(1),即是GUI线程。它初始化⼀个类,并调⽤其⼀个成员函数创建⼀个线程3(ininlistenThred)【不知,为什么不从2开始?】,然后在线程3⾥⾯⼀直循环检测是否有新的客户端发来socket连接。当有新的客户端连接上时,即创建⼀个新的线程专门⽤于socket通信。
此时有⼀客户端连接上,创建了通信⼯作线程4(listenthreadwork)。
输出g_buf[0].carid的代码位置分别为:
1,initlistenthread线程在进⼊循环⼊⼝即打印出:
for( ; ; )
{
    qDebug("listenthread g_buf[0].carid: %s ",g_buf[0].carid);
  char *t = &(g_buf[0].carid[0]);
  qDebug("dizhi: %d \n\n",&t);
//......
}
2,gui主线程在点击按钮的时候,即打印:
qDebug("mainwindow g_buf[0].carid: %s",g_buf[0].carid);
char *t = &(g_buf[0].carid[0]);
qDebug("dizhi: %d \n\n",&t);
3,listenthreadwork线程在循环⼯作的时候开始就打印信息:(⼀进去此线程就会先打印⼀次值,然后每次收到⽂件就会打印⼀次)for( ; ; )
{
qDebug("listenthreadwork g_buf[0].carid: %s",g_buf[0].carid);
char *t = &(g_buf[0].carid[0]);
qDebug("dizhi: %d \n\n",&t);
thread技术
//.........
}
线程3和4的值⼀样的!
线程1跟另外两个线程是不同的值!
跟类没关系的两个线程值⼀样

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。