//1. 可以使用线程局部存储区(TLS)来将数据与线程关联起来 //2.静态TLS #include <windows.h> #include <assert.h> #include <process.h> #include <cstdio> //静态TLS __declspec (thread) int nCount = 0; unsigned int __stdcall FunThread0(void* pVoid) { int nAddr = reinterpret_cast<int>(&nCount); //nAddr = 0x00465b84 return 0; } unsigned int __stdcall FunThread1(void* pVoid) { int nAddr = reinterpret_cast<int>(&nCount); //nAddr = 0x00465b54 return 0; } int main() { HANDLE hThread0 = reinterpret_cast<HANDLE>(_beginthreadex(nullptr, 0, FunThread0, nullptr, 0, nullptr)); HANDLE hThread1 = reinterpret_cast<HANDLE>(_beginthreadex(nullptr, 0, FunThread1, nullptr, 0, nullptr)); WaitForSingleObject(hThread0, INFINITE); WaitForSingleObject(hThread1, INFINITE); CloseHandle(hThread0); CloseHandle(hThread1); return 0; } //3.动态TLS #include <windows.h> #include <assert.h> #include <process.h> #include <cstdio> int nId = 0; unsigned int __stdcall FunThread0(void* pVoid) { if (!TlsSetValue(nId, reinterpret_cast<void*>(1026))) { assert(false); } int nTem = reinterpret_cast<int>(TlsGetValue(nId)); //nTem = 1026 return 0; } unsigned int __stdcall FunThread1(void* pVoid) { if (!TlsSetValue(nId, reinterpret_cast<void*>(1025))) { assert(false); } int nTem = reinterpret_cast<int>(TlsGetValue(nId)); //nTem = 1025 return 0; } int main() { nId = TlsAlloc(); if (-1 == nId) { assert(false); } if (!TlsSetValue(nId, reinterpret_cast<void*>(1024))) { assert(false); } int nTem = reinterpret_cast<int>(TlsGetValue(nId)); //nTem = 1024 HANDLE hThread0 = reinterpret_cast<HANDLE>(_beginthreadex(nullptr, 0, FunThread0, nullptr, 0, nullptr)); HANDLE hThread1 = reinterpret_cast<HANDLE>(_beginthreadex(nullptr, 0, FunThread1, nullptr, 0, nullptr)); WaitForSingleObject(hThread0, INFINITE); WaitForSingleObject(hThread1, INFINITE); CloseHandle(hThread0); CloseHandle(hThread1); if (!TlsFree(nId)) { assert(false); } return 0; } //4. 备注:感觉在实际开发中 TLS 没什么鸟用,这里不进行深入研究