0

我正在学习线程本地存储...(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.... 我做错了什么?

4

2 回答 2

1

几点注意事项:

您的错误检查语句应为:

如果(g_dwTLSIndex == TLS_OUT_OF_INDEXES)。

就目前而言,您分配了 g_dwTlsIndex 两次(因此在第一次分配时丢失了引用。)

做一些基本的调试:

  1. 在 TlsSetValue 之后的行中立即调用 TlsGetValue。这至少有效吗?
  2. 检查返回码。TlsGetValue 和 TlsSetValue 都返回一个函数,告诉您分配是否成功。是吗?
  3. 跟踪您的索引。您正在使用全局变量来存储 g_dwTlsIndex,因此它很容易被更改。alloc 之后的值是多少(使用 printf 来查看)。进行 Get 调用时的值是多少?这些值是否匹配?

这些步骤应该可以帮助您找到问题。

于 2010-06-20T19:28:40.170 回答
0

我认为这val是本地的DllMain

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

TlsSetValue(g_dwTLSIndex,(LPVOID)5);
int data=(int)TlsGetValue(g_dwTLSIndex);
于 2010-09-24T06:43:34.537 回答