能力值:
( 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);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
或者直接在线程内使用局部变量也可以啊。也没见这里利用Tls来绑定线程了。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
还是说,动态的TLS并不需要全局变量,只是利用TLS的方法创建了一个类似于全局变量的数据,它存放在Tls数组内。可是还是觉得不需要这么做啊,啊啊啊啊啊啊啊啊啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
哪怕使用的是malloc得到的结果也是一样的呀,为何需要使用到TLS。这段代码内是模拟了全局变量的样子,但是l...反正说不清楚- -。
|
|
|