我正在学习线程本地存储...(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个....我做错了什么?
答案 0 :(得分:1)
一些注意事项:
您的错误检查语句应为:
if(g_dwTLSIndex == TLS_OUT_OF_INDEXES)。
按照目前的情况,你要分配两次g_dwTlsIndex(因此在第一次分配时会丢失引用。)
做一些基本的调试:
这些步骤可以帮助您找到问题所在。
答案 1 :(得分:0)
我认为val
是DllMain
的本地?
您运行的是哪个版本的Windows? 64位Windows具有64位指针和32位int
,因此所有memcpy
调用都将不正确。而不是使用memcpy
,只需直接转换值:
TlsSetValue(g_dwTLSIndex,(LPVOID)5);
int data=(int)TlsGetValue(g_dwTLSIndex);