预留内存携带附加信息的设计

预留内存携带附加信息的设计

ID:29528300

大小:49.50 KB

页数:4页

时间:2018-12-20

预留内存携带附加信息的设计_第1页
预留内存携带附加信息的设计_第2页
预留内存携带附加信息的设计_第3页
预留内存携带附加信息的设计_第4页
资源描述:

《预留内存携带附加信息的设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、预留内存携带附加信息的设计有时候,将数据与一个对象的实例关联起来是很有帮助的。这种设计要求预留一定的内存,一倍特定附加数据的存储。通过调用SetWindowWord或SetWindowLong函数将数据与一个指定的窗口关联起来,数据保存在窗口附加内存块中。窗口内存块即是一种窗口对象(HWND)的附加数据(windowextrabytes),参考WNDCLASS.cbWndExtra字段(Specifiesthenumberofextrabytestoallocatefollowingthewindowinstance.)。这种预留附加的设计,在

2、MFC中处处可见。对于下拉选择列表(CComboBox)、下拉列表框、列表视图和树控件,我们不光希望其能显示条目内容(itemtext),还希望每个条目能够携带附加信息,即存储额外的关联数据(itemdata),以备不时之需。这四个控件都提供了SetItemData/GetItemData接口,供用户储存关联数据。存储的数据为DWORD值类型,可以是简单的数值,也可以存储指针。 线程消息队列和_ptiddata我们在编写第一个SDK窗口程序时,就接触到了消息这一重要概念。实际上,消息队列是一种线程私有数据,每一个Windows程序的UI(CUI

3、/GUI)线程都维持了一个消息队列。GetMessage、TranslateMessage、DispatchMessage等对消息的操作都是与调用线程的消息队列息息相关。PostThreadMessage是线程消息投递函数,它向一个指定ID(idThread)的线程发送一条消息,然后不等处理立即返回。这个API在多线程架构程序中非常有用。PostQuitMessage是结束线程运行,相当于nExitCode作为WM_QUIT消息参数调用PostThreadMessage。调用线程收到该消息后即ExitThread,故该函数一般用来响应WM_DE

4、STROY消息。尽管秉持封装的原则,我们极力强调避免使用全局变量,但全局变量对于进程级和线程级的系统统筹管理却是非常有用。除了消息队列这种系统内置的线程私有数据外,Windows提供了线程局部存储系统(TLS,ThreadLocalStorage),为用户提供了存储与线程关联数据的接口。前面提到的_beginthreadex中分配的_ptiddata(pointertoper-threaddata),即使用了TLS。_ptiddata为Windows平台的多线程程序中,strtok、strerror(errno)等依赖全局变量或静态变量的CRT

5、函数的实现提供了有效的解决方案。 Win32线程局部存储系统用于管理 TLS 的数据结构是很简单的,Windows仅为系统中的每一个进程维护一个位数组,再为该进程中的每一个线程申请一个同样长度的数组空间,如下图所示。    在Windbg中,可以窥探TEB中的TLS数据结构。lkd>dt_tebnt!_TEB   +0x02cThreadLocalStoragePointer:Ptr32Void   +0xe10TlsSlots         :[64]Ptr32Void   +0xf10TlsLinks         :_LIST_ENT

6、RY   +0xf94TlsExpansionSlots:Ptr32Ptr32Void typedefstruct _TEB //66elements,0xFB8bytes(sizeof){    //……    /*0x02C*/     VOID*        ThreadLocalStoragePointer;    //……    /*0xE10*/     VOID*        TlsSlots[64];    /*0xF10*/     struct_LIST_ENTRY TlsLinks; //2elements,0x8by

7、tes(sizeof)    //……    /*0xF94*/     VOID**       TlsExpansionSlots;    //……}TEB,*PTEB;当一个线程被创建时,Windows就会在进程地址空间中为该线程分配一个长度为TLS_MINIMUM_AVAILABLE的数组,数组成员的值都被初始化为 0。在内部,系统将此数组与该线程关联起来,保证只能在该线程中访问此数组中的数据。如上图所示,每个线程都有它自己的数组,数组成员可以存储任何数据。运行在系统中的每一个进程都有上图所示的一个位数组。位数组的成员是一个标志,每个标

8、志的值被设为FREE或INUSE,指示了此标志对应的数组索引是否在使用中。Windows 保证至少有TLS_MINIMUM_AVAILABLE(定义在

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。