QT环境下,全局变量共享问题

开始的技术路线是:linux

 首先有两个主线程:api

  1,gui线程数组

  2,等待客户端socket链接用的,listen线程服务器

  (当有客户端链接时,即creat一个新的线程2用来跟客户端通讯,再来新的客户端,继续creat新的work线程3用于通讯,以此类推,目前最多能够creat5个线程,便可以同时跟5台客户端通讯,设置了监听的socket服务器最多监听5个队列。线程2继续listen)多线程

 

出现的问题是:socket

  用来通讯的work线程3,收到一个来自客户端的xml文件,而后解析文件,并将其数据放在一个全局的静态struct数组里。数据正常,线程2和线程3都可以看到已经更新的数据值。可是,函数

  当gui线程去访问时,发现数据并无更新到其线程,在gui线程下改变该全局变量的数值,也并无更新到线程2和3,不知何解?ui

 

一博主,有如此解释spa

其实在Linux 中,新建的线程并非在原先的进程中,而是系统经过一个系统调用clone() 。该系统copy 了一个和原先进程彻底同样的进程,并在这个进程中执行线程函数。不过这个copy 过程和fork 不同。copy 后的进程和原先的进程共享了全部的变量,运行环境(clone的实现是能够指定新进程与老进程之间的共享关系,100%共享就表示建立了一个线程)。这样,原先进程中的变量变更在copy 后的进程中便能体现出来。
 
 不过,问题并无清晰化。
 
想到的解决方案暂时有两种:
  1,不在work线程里面解析数据,直接在gui线程里面解析数据。
   2,采用 线程私有数据
 

(此处出现过,小插曲:QT的变量查看器,在调试时不太稳定,更新事后的值在窗口中查看,并无获得及时更新,须要经过程序断定验证!).net

 

另外的问题是:一个变量在多线程环境下,它们的地址都是不一样的,为何呢?待解! 

 

因为程序须要在线程建立以后必须返回到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);
//.........
}

 

  • 线程3和4的值同样的!
  • 线程1跟另外两个线程是不一样的值!
  •  跟类不要紧的两个线程值同样

 

 

相关文章
相关标签/搜索