在一个线程里TlsAlloc一个格子,会返回一个格子的编号TlsIndex,请问哪里存储这个编号呢?
是否需要一个全局的map存储每个线程获得的TlsIndex呢?
否则,下一个函数想使用自己线程里的格子,但不知道编号也不行啊
总不能一直传递这个编号作为参数吧?
我晕了

解决方案 »

  1.   

    看看  __declspec( thread )
      

  2.   

    TlsAlloc分配的index对每一个线程是一样的,在一个线程中分配之后,这个index在其它线程中也就有效了。不用map<ThreadId, TlsIndex>来保存了
      

  3.   

    这么说吧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设值呢?
      

  4.   

    每个线程的TlsIndex肯定不同啊,那就的一个全局数组存所有的TlsIndex啊?
      

  5.   

    比如你使用TlsAlloc得到了一个id为5(假设),那么其它线程中也就可以使用5这个id来取数了,不过每一个线程中取到的数不一样。
      

  6.   

    你可以参考一下这个#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);
    }
      

  7.   

    实际上他们操作的不是同一个slot,不过index一样而已
      

  8.   

    你的意思是当在一个线程里使用TlsAlloc的时候,其实也为所有的线程申请了一个格子?所有的线程都有一个标号相同的格子?
      

  9.   

    这个问题不好说清楚。TLS主要用在DLL里,
    一般DLL被进程加载的时候调用TlsAlloc,即分配你所说的“格子”,从进程里卸载的时候TlsFree。
    进程每创建一个线程(DLL_THREAD_ATTACH),可以分配一块内存给所需的全局对象,并调用TlsSetValue将内存地址存入该线程的相应index的“格子”里,在函数里需要调用该全局对象时再用TlsGetValue得到地址,使用(改变)全局对象。进程的每个线程都有至少64个“格子”,一个模块被加载,可以申请一个格子索引,这个索引可以用在进程的所有线程中(其实也就是TlsSetValue、TlsGetValue)。
      

  10.   

    这个index在所有的线程里都是一样的吧,他指向的值才在各个不同的线程里不一样
    因此楼主需要用一个全局变量保存他即可
      

  11.   

    这个index只是表明这个slot对于这个进程拥有的所有线程 均可用。在DLL里, 需要用全局变量来保存这个index。这是必须的。每个线程均有自己的TLS index数组。因此这个index指向的值在各个线程里的值是独立的互不影响的。
      

  12.   

    还有一点不太理解。
    当在一个函数里用TSAlloc申请一个格子的时候,返回一个index。
    那个每个线程执行到这里,都调用TSAlloc申请一个格子,这时候肯定是不同的index了。
    因此,应该在这些线程启动之前调用一次TSAlloc,然后把返回的index作为全局变量。
    然后,所有的线程的这个index对应的格子都被申领了。
    在后面每个线程每次使用index对应的格子时,都是用的是自己的格子。
    对否?
      

  13.   

    LZ你TLS的概念没搞清,所以才问了这么一个问题
      

  14.   

    http://blog.csdn.net/Tr0j4n/archive/2009/10/06/4636332.aspx