线程局部存储(TLS)的使用

将线程的私有数据(局部存储的数据)共享,以供本进程中的其它线程使用。
l 适用情形:
线程局部存储适用于多线程共享数据,而又不需要同步的情形。(线程同步的开支比较大。)

l 原理
在每个线程中有一个存储区域,该存储区域有64个slot(数据槽)。可以通过该slot的索引值(一个DWORD数值),获取指定的slot。每个slot可以设置,也可以取值。Slot中的数据是本线程中的私有数据。
l 步骤

  1. 分配
    TlsAlloc,获取可用的Slot索引。 该值应当为各个线程所共享。
  2. 设置。
    TlsSetValue,为指定slot设置值,一个指针,指向本线程中的私有数据区。
  3. 取值。
    TlsGetValue,从指定slot中取值,一个指针,指向某个线程中的私有数据。
  4. 释放。
    TlsFree,释放某个slot,使其可以被其它线程使用。
时间: 2024-08-31 18:10:42

线程局部存储(TLS)的使用的相关文章

C++采用TLS线程局部存储的用法实例_C 语言

本文实例讲述了C++采用TLS线程局部存储的用法.分享给大家供大家参考. 具体方法如下: 复制代码 代码如下: // useTLS.cpp : 定义控制台应用程序的入口点.  //    #include "stdafx.h"  #include <Windows.h>  #include <process.h>    //声明  VOID InitStartTime();  DWORD GetUserTime();    //TLS索引,作全局变量   DWO

网络通信-线程局部存储的有关问题

问题描述 线程局部存储的有关问题 有关TLS(线程局部存储)的题目或者源代码,已经学了一部分,深层次点的,谢谢 解决方案 线程局部存储线程局部存储线程局部存储

如何使用线程局部存储实现多线程下的日志系统

概述 通常来说,在应用程序中需要日志来记录程序运行的状态,以便后期问题的跟踪定位.在日志系统的设计中,通常会有一个总的日志系统来统一协调这些日志的设置如位置.输出级别和内容等.在多线程编程中,当每个线程都需要输出日志时,因为要考虑线程间的同步,日志系统的设计更加复杂. 在单线程应用程序中,通常使用一个日志单例向某个文件输出应用运行过程中的重要日志信息,但是在多线程环境中,这样做显然不好,因为各个线程打印出的日志会错综复杂从而使得日志文件不容易阅读和跟踪.比较好的办法是主线程记录自己的日志,各个子

线程局部存储与线程互斥

问题描述 线程局部存储与线程互斥 关于线程局部存储,既然是为了保证各个线程有自己私有的全局变量和静态共享变量,那么它与线程同步机制(临界区.信号量.事件.互斥量)有什么关联呢? 望各路大侠参与讨论.指导!新申请的账号,没有积分,多海涵! 解决方案 跟同步没关系,这个是让线程可以保存一些自己独有的变量.而线程一种同步方法就是通过全局变量. 解决方案二: 各线程独有的变量不需要同步,同步用于多个线程共同访问的变量时用,是为了防止多个线程同时访问某个变量而设计的机制.

C#中Property和Attribute的区别实例详解

  本文实例分析了C#中Property和Attribute的区别.分享给大家供大家参考.具体分析如下: 在C#中有两个属性,分别为Property和Attribute,两个的中文意思都有特性.属性之间,但是用法上却不一样,为了区别,本文暂把Property称为特性,把Attribute称为属性. Attribute才是本文的主角,把它称为属性我觉得很恰当.属性的意思就是附属于某种事物上的,用来说明这个事物的各种特征的一种描述.而Attribute就是干这事的.它允许你将信息与你定义的C#类型相

[综合面试] 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

感谢IT面试群 S-北京-陈磊 的整理分享. 基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会写生产者.消费者问题,完全消化理解) 5. 线程的实现方式. (也就是用户线程与内核线程的区别) 6. 用户态和核心态的区别. 7. 用户栈和内核栈的区别. 8. 内存池.进程池.线程池.(c++程序员必须掌握) 9. 死锁的概念,导致死锁的原因. 10

c++-GetLastError的使用安全么

问题描述 GetLastError的使用安全么 我不是很清楚错误码是线程私有的还是整个操作系统共享的,所以提出此问题,经常看到很多人用GetLastError来获取前一个语句可能出现错误时的错误码来决定后续的操作步骤,但我想知道,如果在发生错误和调用GetLastError中间被其它线程或者进程给改变了错误码,那岂不是得不到真正的错误原因? 解决方案 相对进程是独立的,相对线程是共享的. 解决方案二: 是的,你说对了.GetLastError是线程不安全的. 解决方案三: 安全.因为:GetLa

__stdcall,__cdecl,_cdecl,_stdcall,。__fastcall,_fastcall 区别简介

1.  今天写线程函数时,发现msdn中对ThreadProc的定义有要求:DWORD WINAPI ThreadProc(LPVOID lpParameter);  不解为什么要用WINAPI宏定义,查了后发现下面的定义.于是乎需要区别__stdcall和__cdecl两者的区别: #define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define

静态.共享的规则MFC DLL/MFC扩展DLL详解

引言:在编写MFC程序的时候,通常需要编写dll库以供其他程序调用.关于MFC dll的相关知识很多很杂,这里特酷吧结合自己学习中遇到的问题专门整理了一些MFC dll的基础知识.本部分共上下两篇文章,本文为上篇,MFC DLL应用程序类型分为以下三种:(1)使用共享MFC DLL的规则DLL(2)带静态链接MFC的规则DLL(3)MFC扩展DLL下面重点解释一下这些DLL的含义区别:一,规则DLL首先谈谈所谓的"规则DLL":"规则DLL"是由"Regu