TLS需要一个全局的map<ThreadId, TlsIndex>辅助么? 在一个线程里TlsAlloc一个格子,会返回一个格子的编号TlsIndex,请问哪里存储这个编号呢?是否需要一个全局的map存储每个线程获得的TlsIndex呢?否则,下一个函数想使用自己线程里的格子,但不知道编号也不行啊总不能一直传递这个编号作为参数吧?我晕了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看看 __declspec( thread ) TlsAlloc分配的index对每一个线程是一样的,在一个线程中分配之后,这个index在其它线程中也就有效了。不用map<ThreadId, TlsIndex>来保存了 这么说吧void func1(){ DWORD TlsIndex = TlsAlloc(); // ... TlsSetValue(TlsIndex, 5);}void func2{ // how to get this TlsIndex? TlsGetValue(TlsIndex)};void func(){ func1(); func2();}func1和func2是在一个线程中,怎么给func2中的TlsIndex设值呢? 每个线程的TlsIndex肯定不同啊,那就的一个全局数组存所有的TlsIndex啊? 比如你使用TlsAlloc得到了一个id为5(假设),那么其它线程中也就可以使用5这个id来取数了,不过每一个线程中取到的数不一样。 你可以参考一下这个#include "afx.h"DWORD index;DWORD __stdcall ThreadFunc(PVOID p){ PVOID data=(PVOID)GetCurrentThreadId(); printf("%x\n",data); TlsSetValue(index,data); Sleep(2); data=TlsGetValue(index); ASSERT(data==(PVOID)GetCurrentThreadId()); return 0;}int main(){ index=TlsAlloc(); HANDLE handles[2]; handles[0]=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL); handles[1]=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL); WaitForMultipleObjects(2,handles,TRUE,INFINITE); TlsFree(index);} 实际上他们操作的不是同一个slot,不过index一样而已 你的意思是当在一个线程里使用TlsAlloc的时候,其实也为所有的线程申请了一个格子?所有的线程都有一个标号相同的格子? 这个问题不好说清楚。TLS主要用在DLL里,一般DLL被进程加载的时候调用TlsAlloc,即分配你所说的“格子”,从进程里卸载的时候TlsFree。进程每创建一个线程(DLL_THREAD_ATTACH),可以分配一块内存给所需的全局对象,并调用TlsSetValue将内存地址存入该线程的相应index的“格子”里,在函数里需要调用该全局对象时再用TlsGetValue得到地址,使用(改变)全局对象。进程的每个线程都有至少64个“格子”,一个模块被加载,可以申请一个格子索引,这个索引可以用在进程的所有线程中(其实也就是TlsSetValue、TlsGetValue)。 这个index在所有的线程里都是一样的吧,他指向的值才在各个不同的线程里不一样因此楼主需要用一个全局变量保存他即可 这个index只是表明这个slot对于这个进程拥有的所有线程 均可用。在DLL里, 需要用全局变量来保存这个index。这是必须的。每个线程均有自己的TLS index数组。因此这个index指向的值在各个线程里的值是独立的互不影响的。 还有一点不太理解。当在一个函数里用TSAlloc申请一个格子的时候,返回一个index。那个每个线程执行到这里,都调用TSAlloc申请一个格子,这时候肯定是不同的index了。因此,应该在这些线程启动之前调用一次TSAlloc,然后把返回的index作为全局变量。然后,所有的线程的这个index对应的格子都被申领了。在后面每个线程每次使用index对应的格子时,都是用的是自己的格子。对否? LZ你TLS的概念没搞清,所以才问了这么一个问题 http://blog.csdn.net/Tr0j4n/archive/2009/10/06/4636332.aspx 用vector保存结构体指针,退出时遍历删除这些指针,却还有内存泄漏。 残影问题 怎么在程序结束的时候释放内存 VC6怎么把程序的用到资源封装起来 怎么获得进程自身打开的端口? 如何在继承自CWinThread的UI线程中建立消息循环 如何通过ado在一个access文件中同时建多张表!!万分感谢!散分 各位同志,给个见意吧! 请教ATL???? 急:exe调用DLL里面方法,运行exe,从dll方法里面出错,弹出“内存不能read”对话框 vc++实现禁用刻录机的功能!!! 这段C#(HttpWebResponse)用C++怎么实现?
{
DWORD TlsIndex = TlsAlloc();
// ...
TlsSetValue(TlsIndex, 5);
}
void func2
{
// how to get this TlsIndex?
TlsGetValue(TlsIndex)
};
void func()
{
func1();
func2();
}func1和func2是在一个线程中,怎么给func2中的TlsIndex设值呢?
DWORD index;
DWORD __stdcall ThreadFunc(PVOID p)
{ PVOID data=(PVOID)GetCurrentThreadId();
printf("%x\n",data);
TlsSetValue(index,data);
Sleep(2);
data=TlsGetValue(index);
ASSERT(data==(PVOID)GetCurrentThreadId());
return 0;
}
int main()
{
index=TlsAlloc();
HANDLE handles[2];
handles[0]=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL);
handles[1]=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL);
WaitForMultipleObjects(2,handles,TRUE,INFINITE);
TlsFree(index);
}
一般DLL被进程加载的时候调用TlsAlloc,即分配你所说的“格子”,从进程里卸载的时候TlsFree。
进程每创建一个线程(DLL_THREAD_ATTACH),可以分配一块内存给所需的全局对象,并调用TlsSetValue将内存地址存入该线程的相应index的“格子”里,在函数里需要调用该全局对象时再用TlsGetValue得到地址,使用(改变)全局对象。进程的每个线程都有至少64个“格子”,一个模块被加载,可以申请一个格子索引,这个索引可以用在进程的所有线程中(其实也就是TlsSetValue、TlsGetValue)。
因此楼主需要用一个全局变量保存他即可
当在一个函数里用TSAlloc申请一个格子的时候,返回一个index。
那个每个线程执行到这里,都调用TSAlloc申请一个格子,这时候肯定是不同的index了。
因此,应该在这些线程启动之前调用一次TSAlloc,然后把返回的index作为全局变量。
然后,所有的线程的这个index对应的格子都被申领了。
在后面每个线程每次使用index对应的格子时,都是用的是自己的格子。
对否?