windows核心编程指南21.pdf

windows核心编程指南21.pdf

ID:51490965

大小:301.94 KB

页数:6页

时间:2020-03-25

windows核心编程指南21.pdf_第1页
windows核心编程指南21.pdf_第2页
windows核心编程指南21.pdf_第3页
windows核心编程指南21.pdf_第4页
windows核心编程指南21.pdf_第5页
资源描述:

《windows核心编程指南21.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、下载第21章线程本地存储器有时,将数据与对象的实例联系起来是很有帮助的。例如,窗口的附加字节可以使用SetWindowsWord和SetWindowLong函数将数据与特定的窗口联系起来。可以使用线程本地存储器将数据与执行的特定线程联系起来。例如,可以将线程的某个时间与线程联系起来。然后,当线程终止运行时,就能够确定线程的寿命。C/C++运行期库要使用线程本地存储器(TLS)。由于运行期库是在多线程应用程序出现前的许多年设计的,因此运行期库中的大多数函数是用于单线程应用程序的。函数strtok就是个很好的例子。应用程序初次调用strtok时,该函数传递一个字符串的地址,并将字符串的地址保存在

2、它自己的静态变量中。当你将来调用strtok函数并传递NULL时,该函数就引用保存的字符串地址。在多线程环境中,一个线程可以调用strtok,然后,在它能够再次调用该函数之前,另一个线程也可以调用Strtok。在这种情况下,第二个线程会在第一个线程不知道的情况下,让strtok用一个新地址来改写它的静态变量。第一个线程将来调用strtok时将使用第二个线程的字符串,这就会导致各种各样难以发现和排除的错误。为了解决这个问题,C/C++运行期库使用了TLS。每个线程均被赋予它自己的字符串指针,供strtok函数使用。需要予以同样对待的其他C/C++运行期库函数还有asctime和gmtime。如

3、果你的应用程序需要严重依赖全局变量或静态变量,那么TLS能够帮助解决它遇到的问题。但是编程人员往往尽可能减少对这些变量的使用,而更多地依赖自动(基于堆栈的)变量和通过函数的参数传递的数据。这样做是很好的,因为基于堆栈的变量总是与特定的线程相联系的。标准的C运行期库一直是由许多不同的编译器供应商来实现和重新实现的。如果C编译器不包含标准的C运行期库,那么就不值得去购买它。编程员多年来一直使用标准的C运行期库,并且将会继续使用它,这意味着strtok之类的函数的原型和行为特性必须与上面所说的标准C运行期库完全一样。如果今天重新来设计C运行期库,那么它就必须支持多线程应用程序的环境,并且必须采取相

4、应的措施来避免使用全局变量和静态变量。在我的软件开发项目中,我总是尽可能避免使用全局变量和静态变量。如果你的应用程序使用全局变量和静态变量,那么建议你务必观察每个变量,并且了解一下它能否改变成基于堆栈的变量。如果打算将线程添加给应用程序,那么这样做可以节省大量时间,甚至单线程应用程序也能够从中得到许多好处。在编写应用程序和DLL时,可以使用本章中介绍的两种TLS方法,即动态TLS和静态TLS。但是,当创建DLL时,这些TLS往往更加有用,因为DLL常常不知道它们链接到的应用程序的结构。不过,当编写应用程序时,你通常知道将要创建多少线程以及如何使用这些线程。然后就可以创造一些临时性的方法,或者

5、最好是使用基于堆栈的方法(局部变量),将数据与创建的每个线程联系起来。不管怎样,应用程序开发人员也能从本章讲述的内容中得到一些启发。21.1动态TLS若要使用动态TLS,应用程序可以调用一组4个函数。这些函数实际上是DLL用得最多的函数。图21-1显示了Windows用来管理TLS的内部数据结构。510计计第四部分动态链接库下载进程线程本地存储器的位标志:0-(TLS_MINIMUM_AVAILABLE-1)线程1线程20引索00引索00引索10引索10引索20引索20引索30引索30引索40引索40索引TLS_MINIMUM_AVAILABLE-20索引TLS_MINIMUM_AVAILA

6、BLE-20索引TLS_MINIMUM_AVAILABLE-20索引TLS_MINIMUM_AVAILABLE-2图21-1用于管理TLS的内部数据结构该图显示了系统中运行的线程正在使用的一组标志。每个标志均可设置为FREE或者INUSE,表示TLS时隙(slot)是否正在使用。Microsoft保证至少TLS_MINIMUM_AVAILABLE位标志是可供使用的。另外,TLS_MINIMUM_AVAILABLE在WinNT.h中被定义为64。Windows2000将这个标志数组扩展为允许有1000个以上的TLS时隙。对于任何一个应用程序来说,这个时隙数量足够了。若要使用动态TLS,首先必须

7、调用TlsAlloc函数:这个函数命令系统对进程中的位标志进行扫描,并找出一个FREE标志。然后系统将该标志从FREE改为INUSE,并且TlsAlloc返回位数组中的标志的索引。DLL(或应用程序)通常将该索引保存在一个全局变量中。这是全局变量作为一个较好选择的情况之一,因为它的值是每个进程而不是每个线程使用的值。如果TlsAlloc在该列表中找不到FREE标志,它就返回TLS_OUT_OF_INDEXES

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

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

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