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

      

  • 相关阅读:
    python奇技淫巧——max/min函数的用法
    mysql中InnoDB存储引擎的行锁和表锁
    supervisor进程管理工具
    Tornado源码分析 --- Cookie和XSRF机制
    Tornado源码分析 --- Redirect重定向
    Tornado源码分析 --- 静态文件处理模块
    Tornado源码分析 --- Etag实现
    Python环境管理--virtualenvwrapper
    记录
    由 '' in 'abc' return True 引发的思考----Python 成员测试操作
  • 原文地址:https://www.cnblogs.com/szn409/p/8570182.html
Copyright © 2011-2022 走看看