zoukankan      html  css  js  c++  java
  • 第二十一章 线程局部存储区

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

      

  • 相关阅读:
    使用XmlDataDocument将数据存储到XML文档
    Dubbo+Nacos 运行异常io.netty.handler.codec.EncoderException: java.lang.NullPointerException
    一、字符串常量Java内部加载
    更高效率,Java快速获取图片尺寸宽高分辨率(支持webp)
    水印宽高比例自适应图片(Java-Thumbnails)
    UEditor 自定义图片视频尺寸校验
    应用宝官方错误日志
    Eclipse使用hibernate插件
    解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
    [Err] 1022
  • 原文地址:https://www.cnblogs.com/szn409/p/8570182.html
Copyright © 2011-2022 走看看