COM 里面不支持TLS(Thread Local Storage) 吗?
我在COM里面写了下面的代码出错了:
__declspec(thread) static int num = 321;
void test()
{
int i = num; // got an error " Access violation reading location 0x00000000. "
num = 332211;
Sleep(5000);
i = num;
}
然而这个代码在普通的dll中可以运行。
如果com不支持的话,我想问下在com有个static的全局变量,如果想在com里面实现多线程,而且每个线程都能单独维护自己的这个static的全局变量,如何做到?
谢谢!
[解决办法]
你的客户端也是VC的程序吗?
这种静态的TLS定义有些危险 "__declspec(thread) "。就是LoadLibrary有可能不初始化__tls_index,这样你就出现0x000000了(因为你的__tls_index没有初始化)。 COM 其实就是个LoadLibrary,我估计很可能没有叫LdrInitializeTls。(不敢100%肯定,我得查一下)。但是静态使用在Kernel初始化的时候100%会叫这个。
你随便写个程序,直接LoadLibrary=》Test,看有没有类似问题。 还是尽量少用TLS了,如果一定要用还是动态分配安全些。