首页
社区
课程
招聘
[求助]为什么线程中使用Tls而不是直接分配内存?
发表于: 2012-7-7 23:28 4517

[求助]为什么线程中使用Tls而不是直接分配内存?

2012-7-7 23:28
4517
今晚看了相关的文章,都说在线程的开头使用LocalAlloc,那么竟然LocalAlloc不同线程分配到的内存地址都是不同的,为何还要将其设置入Tls表中? 何不直接使用分配的不同的地址。那么不也实现了各个线程内的变量不会共享的问题了?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如以下代码:为何不直接在线程内使用通过(LPVOID) LocalAlloc(LPTR, 256)得到的lpvData指针,却要将其存入Tls中??? 既增加了代码量,又多此一举了不是么?也没看到以下代码对全局变量有什么猫腻....整个就是一些线程局部变量啊。,
#include <windows.h>
#include <stdio.h>
#define THREADCOUNT 4
DWORD dwTlsIndex;
VOID ErrorExit(LPSTR); 
VOID CommonFunc(VOID)
{
   LPVOID lpvData; 
// Retrieve a data pointer for the current thread. 
   lpvData = TlsGetValue(dwTlsIndex);
   if ((lpvData == 0) && (GetLastError() != ERROR_SUCCESS))
      ErrorExit("TlsGetValue error"); 
// Use the data stored for the current thread. 
   printf("common: thread %d: lpvData=%lx\n",
      GetCurrentThreadId(), lpvData); 
   Sleep(5000);
} 
DWORD WINAPI ThreadFunc(VOID)
{
   LPVOID lpvData; 
// Initialize the TLS index for this thread. 
   lpvData = (LPVOID) LocalAlloc(LPTR, 256);
   if (! TlsSetValue(dwTlsIndex, lpvData))
      ErrorExit("TlsSetValue error"); 
   printf("thread %d: lpvData=%lx\n", GetCurrentThreadId(), lpvData); 
   CommonFunc(); 
// Release the dynamic memory before the thread returns. 
   lpvData = TlsGetValue(dwTlsIndex);
   if (lpvData != 0)
      LocalFree((HLOCAL) lpvData); 
   return 0;
} 
int main(VOID)
{
   DWORD IDThread;
   HANDLE hThread[THREADCOUNT];
   int i; 
// Allocate a TLS index. 
   if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)
      ErrorExit("TlsAlloc failed"); 
// Create multiple threads. 
   for (i = 0; i < THREADCOUNT; i++)
   {
      hThread[i] = CreateThread(NULL, // default security attributes
         0,                           // use default stack size
         (LPTHREAD_START_ROUTINE) ThreadFunc, // thread function
         NULL,                    // no thread function argument
         0,                       // use default creation flags
         &IDThread);              // returns thread identifier 
   // Check the return value for success.
      if (hThread[i] == NULL)
         ErrorExit("CreateThread error\n");
   } 
   for (i = 0; i < THREADCOUNT; i++)
      WaitForSingleObject(hThread[i], INFINITE); 
   TlsFree(dwTlsIndex); 
   return 0;
}
VOID ErrorExit (LPSTR lpszMessage)
{
   fprintf(stderr, "%s\n", lpszMessage);
   ExitProcess(0);
}
2012-7-7 23:31
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
或者直接在线程内使用局部变量也可以啊。也没见这里利用Tls来绑定线程了。
2012-7-7 23:34
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
还是说,动态的TLS并不需要全局变量,只是利用TLS的方法创建了一个类似于全局变量的数据,它存放在Tls数组内。可是还是觉得不需要这么做啊,啊啊啊啊啊啊啊啊啊。
2012-7-8 00:03
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哪怕使用的是malloc得到的结果也是一样的呀,为何需要使用到TLS。这段代码内是模拟了全局变量的样子,但是l...反正说不清楚- -。
2012-7-8 00:10
0
游客
登录 | 注册 方可回帖
返回
//