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,不知何解?

一博主,有如此解释

其实在Linux 中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone() 。该系统copy 了一个和原先进程完全一样的进程,并在这个进程中执行线程函数。不过这个copy 过程和fork 不一样。copy 后的进程和原先的进程共享了所有的变量,运行环境(clone的实现是可以指定新进程与老进程之间的共享关系,100%共享就表示创建了一个线程)。这样,原先进程中的变量变动在copy 后的进程中便能体现出来。

不过,问题并没有清晰化。

想到的解决方案暂时有两种:

  1,不在work线程里面解析数据,直接在gui线程里面解析数据。

  2,采用线程私有数据

(此处出现过,小插曲:QT的变量查看器,在调试时不太稳定,更新过后的值在窗口中查看,并没有得到及时更新,需要通过程序判定验证!)

  

时间: 2024-10-12 09:50:57

QT环境下,<POSIX多线程>全局变量共享问题的相关文章

多线程编程之Linux环境下的多线程(一)

一.Linux环境下的线程 相对于其他操作系统,Linux系统内核只提供了轻量级进程的支持,并未实现线程模型.Linux是一种“多进程单线程”的操作系统,Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程. 进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量).Linux中所谓的“线程”只是在被创建时clone了父进程的资源,因此clone出来的进程表现为“线程”,这一点一定要弄清楚.因此,Linux“线程”这个概念只有在打冒号的情况下才是

最强数学库GSL(GNU Scientific Library) Qt环境下部署

1.前言 GSL(GNU Scientific Library)是一个 C 写成的用于科学计算的库,有超过1000个函数,该库提供了关于数学计算的很多方面,Matlab的大部分函数几乎都能借助它实现,可以在数值计算中省却很多事情.关于GSL的详细功能.GSL的功能及相关头文件的介绍可以见此偏文章:http://blog.csdn.net/augusdi/article/details/8834182,或者看看这位仁兄的blog:http://www.cnblogs.com/Jedimaster/

qt 环境下mapx组件的鼠标跟踪

经过两天的研究mapx组件人坐标转换还是没有转换成功,因为不管怎么变,定点转换的经纬度坐标始终与期望的值有较大的偏差.最后还是想老大请教了一下,划了半天功夫就研究出来了(不愧是老大,仰慕之情犹如滔滔江水……):老大说,组件导出的包文件中坐标转换函数在qt环境下有问题,你使用vc下面的dll就可以了,还给了一个链接让参考,再次感谢这位博主.http://blog.csdn.net/zirandeai/article/details/51160111 下面给出vc做的动态库,,可以直接下载.http

多线程编程之Linux环境下的多线程(三)

前面两篇文章都讲述了Linux环境下的多线程编程基础知识,也附带了典型实例.本文主要比较一下Linux环境与Windows环境下的多线程编程区别. 看待技术问题要瞄准其本质,不管是WIN32.Linux还是VxWorks,其涉及到多线程的部分都是那些内容,无非就是线程控制和线程通信,它们的许多函数只是名称不同,其实质含义是等价的,下面我们来列个三大操作系统共同点详细表单: 事项 WIN32 Linux VxWorks 线程创建 CreateThread pthread_create taskSp

多线程编程之Linux环境下的多线程(二)

上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了三种基本的同步机制:互斥.读写锁.条件变量.下面分别针对这三种机制进行说明: 一.线程互斥 互斥意味着具有“排它性”,即两个线程不能同时进入被互斥保护的代码.Linux下可以通过pthread_mutex_t 定义互斥体机制完成多线程的互斥操作,该机制的作用是对某个需要互斥的部分,在进入时先得到互斥体,如果没有得到互斥体,表明

Qt 环境下做的小滑块组件

Qt下实现在里面添加键值对的两个值,设置其显示模式,使其动态滑动出来 详细功能看代码! kinfocube.h /*************************************************=========================================================================== * 模块名称:信息块 KInfoCube * 功能说明:滑动显示信息模块,具有水平显示和垂直显示模式 * ---------------

Qt 环境下的mapx控件-------2

今天花了一天的时间去查找mapx相关的资料,但是到最后想要的东西还是一无所获,不过还是学到了很多东西.下面以大家分享一下: mapx软件的安装:下载后安装mapx软件,成功后会在安装路径下存在activex文件 然后使用管理员权限在cmd窗口注册该控件 regsvr32 C:\mapx\MapX4\MAPX40.OCX 注意:这里换成自己的安装路径,路径中间不要有空格,否则空间的注册数失败 排除上述问题后注册会成功 最后打开系统注册表就可以查看系统注册表中是否存在该控件 regedit -->编

qt 环境下mapx组件打包后编译产生c2248和c2512错误

C:\Qt\Qt5.6.0\5.6\msvc2013\include\QtCore\qmetatype.h:760: error: C2248: “MapSpace::IRowCursor::IRowCursor”: 无法访问 private 成员(在“MapSpace::IRowCursor”类中声明) C:\Qt\Qt5.6.0\5.6\msvc2013\include\QtCore\qmetatype.h:761: error: C2512: “MapSpace::IRowCursor”:

qt环境下Mapx组建的编程---------regoin

#include "widget.h" #include "ui_widget.h" #include <QPushButton> #include <QToolBar> Widget::Widget(QWidget *parent) : QWidget(parent), map(nullptr), pCMapXPoint(nullptr),pCMapXPoint1(nullptr),pCMapXPoint2(nullptr), pCMapF