C ++ TLS,有些不对劲

时间:2010-06-20 19:04:12

标签: c++ multithreading winapi thread-local-storage

我正在学习线程本地存储...(TLS) 这是我的TLS Alloc代码:

//global variable
DWORD g_dwTlsIndex;

//inside DLLMain:
int val= 5;
 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
  g_dwTlsIndex = TlsAlloc();

  if ((g_dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)
  {
   printf("No more indexes available");
  }

  void *pint;
  memcpy(&pint, &val, sizeof val);

  TlsSetValue(g_dwTlsIndex, pint);
  break;

现在我尝试从TLS中获取值:(在另一个CPP文件中)

// declare index value...
extern DWORD g_dwTlsIndex;

   int  data;
 LPVOID d;
 d = TlsGetValue(g_dwTlsIndex);
 memcpy(&data, &d, sizeof d);

 printf("Data: %d", data);

但数据包含0,我在其中放了5个....我做错了什么?

2 个答案:

答案 0 :(得分:1)

一些注意事项:

您的错误检查语句应为:

if(g_dwTLSIndex == TLS_OUT_OF_INDEXES)。

按照目前的情况,你要分配两次g_dwTlsIndex(因此在第一次分配时会丢失引用。)

做一些基本的调试:

  1. 在TlsSetValue之后立即调用行中的TlsGetValue。这至少有用吗?
  2. 检查返回代码。 TlsGetValue和TlsSetValue都返回一个函数,告诉你赋值是否成功。是吗?
  3. 跟踪您的索引。您正在使用全局变量来存储g_dwTlsIndex,因此很容易被更改。 alloc之后的值是什么(使用printf查看)。进行Get呼叫时有什么价值?这些值是否匹配?
  4. 这些步骤可以帮助您找到问题所在。

答案 1 :(得分:0)

我认为valDllMain的本地?

您运行的是哪个版本的Windows? 64位Windows具有64位指针和32位int,因此所有memcpy调用都将不正确。而不是使用memcpy,只需直接转换值:

TlsSetValue(g_dwTLSIndex,(LPVOID)5);
int data=(int)TlsGetValue(g_dwTLSIndex);