第二十一章 线程局部存储区

//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 没什么鸟用,这里不进行深入研究

  

原文地址:https://www.cnblogs.com/szn409/p/8570182.html