搜索
您当前的位置:首页 > 高仿资讯
基于线程局部存储技术的多通道数控系统仿真
发布时间:2013-09-27 02:37:35 线程 全局 组件

  1 概述

  组件对象模型(CompONent Object Model, COM)是由美国微软公司提出的一种二进制代码互操作规范,ActiveX 是实现了一些特定接口(例如IDispatch)的标准COM 组件。

  COM/ActiveX 规范已成为软件业内最重要的工业标准之一。

  基于组件的软件构架方法通过重用已有的软件组件,可使软件开发者像搭积木一样快速构造应用软件,从而提高生产效率,使软件设计更加规范可靠。目前基于组件的软件开发方法已经在业界得到广泛应用。在数控系统中也使用组件技术实现加工仿真,但现有文献较少涉及多个ActiveX 组件实例的情况。ActiveX 组件采用类似Windows消息运行机制的单套间模型(Single Threaded Apartment, STA)来串行化对组件属性和方法的调用,即对ActiveX 组件的所有调用由COM 系统负责线程的同步。因此,该组件的调用是线程安全的。

  COM 在STA 套间内的线程中创建一个隐藏窗口,将套间外的线程对这个对象的调用都转变成对隐藏窗口发送消息,并由隐藏窗口的消息处理函数来实际调用组件对象,从而实现STA 套间模型。

  一个进程中的所有线程均处于同一虚拟地址空间,每个函数的局部变量在运行该函数的每个线程中都是唯一的,但静态和全局变量则被所有线程所共享。即在多个ActiveX 组件实例的情况下,ActiveX 组件的 STA 模型不能保证全局数据成员是线程安全的。

  2 线程局部存储原理

  线程局部存储(Thread Local Storage, TLS)是Win32 系统提供的一种简化多线程程序设计的底层基础技术,其实质是介入全局数据创建过程,建立并管理全局数据与线程的关联,使得全局数据为其关联线程所私有。TLS 原理如图1 所示。

11.jpg

  每个进程拥有一组TLS 槽口(Slot),每个槽口用序号标识,Windows 2000 有1 088 个这样的槽口。线程通过API 函数可以分配TLS 槽口,在TLS 槽口存取数据,进程中使用同一个序号的不同线程可指向独立的局部堆内存中进行数据存储,即线程ID 和槽口号确定了一个二维空间映射,线程通过API 函数获得线程间相互独立的数据存储地址。

  图1也表明了采用TLS 机制的具有2 个ActiveX 组件实例的运行时软件内存结构,进程分配了2 个TLS 索引值gdwTlsIndex1 和 gdwTlsIndex2,这2 个索引值代表了TLS槽口的序号,但不同线程按照相同的序号却得到2 个独立的局部堆地址,而这些数据在线程内却具有全局数据的可访问性,即每个线程有单独的全局数据拷贝,该数据对线程内的函数具有全局作用域。

  Win32 系统中与TLS 有关的API 及用法如下:

  (1)进程初始化时分配TLS 槽口:

  DWORD gdwTlsIndex;gdwTlsIndex = TlsAlloc();

  (2)调用TlsSetValue 保存数据:

  LPVOID lpvBuffer;lpvBuffer = (LPVOID) LocalAlloc(LPTR, 256);

  TlsSetValue(gdwTlsIndex, lpvBuffer); //保存存储区指针

  (3)调用TlsGetValue 取数据:

  LPVOID lpvData;lpvData = http://info.1688.com/detail/TlsGetValue(gdwTlsIndex); //取TLS 槽口中保存的存//储区指针

  (4)调用TlsFree 释放槽口:

  lpvBuffer = TlsGetValue(gdwTlsIndex);

  LocalFree((HLOCAL) lpvBuffer); //释放存储区

  TlsFree(gdwTlsIndex); //释放TLS 槽口

  3 应用实例

  一种基于Z-Buffer 的铣削实体加工仿真算法,华中数控HNC-32 数控系统HMI 的仿真系统继承自该代码,其主要结构如下:

12.jpg

 ∩见,显示缓存等核心数据结构设计为全局变量,但HNC-32 的设计目标是多通道数控系统,每个通道都需要一个实体加工仿真组件的实例,由于全局缓存数据为所有实例共享,因此出现的所有通道显示内容将完全一致,无法实现多通道仿真。为简化改造工作,将原系统中约50 多个全局变量合并为一个结构,并将原全局变量作为其成员,即一个大的结构变量包括了50 个原全局变量。

  按照 TLS 要求该结构变量必须动态创建,如下代码表明了它的声明、创建过程,代码还表明每个ActiveX 组件构造时即调用API 函数TlsAlloc 获得一个线程索引,在局部堆申请到存储空间后用API 函数TlsSetValue 将该存储区地址与线程索引对应。

13.jpg

14.jpg

  在其他函数中,可以通过线程索dwTlsIndex 调用API函数TlsGetValue 引访问到上述大结构变量,进而访问到原全局变量,代码如下:

可能对这些感兴趣:
  芯片设计解决方案供应商微捷码(Magma®)设计自动化有限公司日前宣布,性能优化片上系统(SoC)存储器核心与性能匹配标准单元库和输入/输
北京时间12月5日消息,美国弗吉尼亚理工大学一位研究生近日研制出一种神奇的机械水母。这种机器人不仅仅外观极像水母,而且也可以和水母一样在水
  网络热销的几种仿真“肚子”。   只有你想不到的,没有买不到的。继“人脸面具”网络热销之后,一种新的仿真&ldq
  从根本上来说,电磁兼容在测试暗室内针对现有的模型是进行测试验证的。这些测试不但价格昂贵而且还耗费大量时间。在设计过程中应用早期的软件
  一、 引言   射频仿真系统的子系统-天线阵列及馈电系统,主要用于模拟弹目间的视线角运动,为了保 证天线阵列及馈电系统的角位置模拟精度,
  引言   太阳能电池作为一种清洁能源越来越受到广泛的关注。其光电转换效率很大程度上取决于多晶硅的质量,而多晶硅质量又取决于硅锭定向凝
  0引言  工程图学课程教学理论与实践相结合是非常重要的特别是学生的动手及创新能力的培养,是理论性和实践性都较强的课程,因此实验教学环
乔帮主已经离我们而去,但他永远活在我们心中。日前,一家玩具厂为了缅怀乔布斯,专门发行了一套比例为1:6的乔布斯手办。与之前的“山寨&r
高仿奢侈品商城链接

推荐阅读