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

      

  • 相关阅读:
    逻辑指的是思维的规律和规则,是对思维过程的抽象。
    逻辑
    什么是概念,判断和推理
    逻辑思维
    console.log 用法
    console.log()的作用是什么
    vue-cli创建的项目中引入第三方库报错 'caller', 'calle', and 'arguments' properties may not be...
    element-ui中upload组件如何传递文件及其他参数
    vueThink权限配置
    vue2.0集成百度UE编辑器,上传图片报错!!!
  • 原文地址:https://www.cnblogs.com/szn409/p/8570182.html
Copyright © 2011-2022 走看看