__declspec(thread)不支持使用LoadLibrary动态加载的情况
2013-02-14 02:32
260 查看
__declspec(thread)变量是在静态链接的时候确定存储位置的, 如果动态加载, 这些变量实际上都是空, 地址可能是0或者任何数值.
MSDN的说明: 在 Windows Vista 之前的 Windows 操作系统中,__declspec( thread ) 有一些限制。 如果 DLL 将任何数据或对象声明为 __declspec(线程),则动态加载该 DLL 时会导致保护错误。 使用 LoadLibrary 加载 DLL 后,每当代码引用 __declspec(线程)数据时,该
DLL 都将导致系统故障。 由于线程的全局变量空间是在运行时分配的,因此此空间的大小是以应用程序的需求和所有静态链接的 DLL 的需求相加为基础计算出来的(也就是说,DLL所需的存储空间实际上仍然是引用它的进程来分配的,所以同一个DLL被不同的进程引用各自都有独立的地址空间,而存在线程变量的空间是编译EXE时确定的,所以LoadLibrary的DLL,因为只有EXE运行的时候才执行,编译时是无法确定的。但是Vista之后的版本,使用了其它机制,保证动态加载DLL,这些线程变量仍然能够正确的获得所需空间)。
使用 LoadLibrary 时,无法扩展此空间以允许放置用 __declspec( thread ) 声明的线程本地变量。 如果 DLL 可能是用 LoadLibrary 加载的,请在 DLL 中使用 TLS API(如 TlsAlloc)来分配 TLS。
TLS有4个函数: TlsAlloc(), TlsFree(index), TlsSetValue(index,value), TlsGetValue(index).
但是仍然有问题, 使用一个线程变量需要一个数字索引, 这个数字索引存储在哪里呢? 一个办法是, 声明几个全局的静态整数, 分别存储索引, 需要操作某个线程变量, 就从对应的静态整数取索引, 然后在使用索引操作线程变量.
MSDN的说明: 在 Windows Vista 之前的 Windows 操作系统中,__declspec( thread ) 有一些限制。 如果 DLL 将任何数据或对象声明为 __declspec(线程),则动态加载该 DLL 时会导致保护错误。 使用 LoadLibrary 加载 DLL 后,每当代码引用 __declspec(线程)数据时,该
DLL 都将导致系统故障。 由于线程的全局变量空间是在运行时分配的,因此此空间的大小是以应用程序的需求和所有静态链接的 DLL 的需求相加为基础计算出来的(也就是说,DLL所需的存储空间实际上仍然是引用它的进程来分配的,所以同一个DLL被不同的进程引用各自都有独立的地址空间,而存在线程变量的空间是编译EXE时确定的,所以LoadLibrary的DLL,因为只有EXE运行的时候才执行,编译时是无法确定的。但是Vista之后的版本,使用了其它机制,保证动态加载DLL,这些线程变量仍然能够正确的获得所需空间)。
使用 LoadLibrary 时,无法扩展此空间以允许放置用 __declspec( thread ) 声明的线程本地变量。 如果 DLL 可能是用 LoadLibrary 加载的,请在 DLL 中使用 TLS API(如 TlsAlloc)来分配 TLS。
TLS有4个函数: TlsAlloc(), TlsFree(index), TlsSetValue(index,value), TlsGetValue(index).
但是仍然有问题, 使用一个线程变量需要一个数字索引, 这个数字索引存储在哪里呢? 一个办法是, 声明几个全局的静态整数, 分别存储索引, 需要操作某个线程变量, 就从对应的静态整数取索引, 然后在使用索引操作线程变量.
相关文章推荐
- System.Lazy<T>延迟加载 在很多情况下,有些对象需要在使用时加载或根据逻辑动态加载。有些情况如果不延迟加载,可能会影响效率甚至抛出Timeout Exception。如网络操作、数据库操
- 线程局部存储,Part 5:加载器对__declspec(thread)变量的支持(进程初始化阶段)
- 使用js加载器动态加载外部Javascript文件
- 使用jsTree动态加载节点
- 使用jquery动态加载js,css文件
- Android基础之使用inflater来实现动态加载布局
- 使用jquery动态加载js,css文件
- Android布局 使用LayoutInflater动态加载布局和操作控件
- 使用echarts动态加载数据
- ThreadSafeClientConnManager用来支持多线程的使用http client
- android Fragment动态加载的使用详解
- Qt:使用Model-View,动态的加载显示数据
- 【Android开发学习44】android: 静态XML和动态加载XML混合使用,以及重写Layout控件
- 使用动态编程方法,在降低时间复杂度的情况下获得背包问题的最优解
- Android使用DexClassLoader动态加载未安装Apk
- iOS 使用动态库(dylib)和动态加载framework
- Android学习笔记31-使用惰性控件ViewStub实现布局动态加载
- Android使用DexClassLoader动态加载未安装Apk