`

[转]线程本地存储(Thread Local Storage, TLS)分析与使用

    博客分类:
  • c++
 
阅读更多
线程本地存储(Thread Local Storage, TLS)简单分析与使用

在多线程编程中, 同一个变量, 如果要让多个线程共享访问, 那么这个变量可以使用关键字volatile进行声明; 那么如果一个变量不想使多个线程共享访问, 那么该怎么办呢? 呵呵, 这个办法就是TLS, 线程本地存储. 它的使用非常之简单, 只要对变量的声明使用__declspec(thread)就OK了. 下面我来举一个例子, 结合注释, 相信大家马上就能知道其”奥秘”了.

#include "stdafx.h"
#include <stdio.h>

__declspec(thread) int g_nData = 0; //这就是两个线程都要访问的变量
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
g_nData = 5;
//辅线程睡眠100ms, 保证主线程的g_nData = 10; 语句执行成功
    Sleep(100);
    char szMsg[40] = {0};
    sprintf(szMsg, "Auxi thread, g_nData: %d", g_nData);
    MessageBox(NULL, szMsg, "AuxiThread", MB_ICONINFORMATION);
    return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
            // TODO: Place code here.
DWORD dwId;
//创建线程, 并立即启动它
    HANDLE hThread = CreateThread(NULL, 1024, ThreadProc, NULL, 0, &dwId);
assert(hThread);
//主线程睡50ms, 保证辅线程的g_nData = 5; 语句执行成功
    Sleep(50);
    g_nData = 10;
    char szMsg[40] = {0};
    sprintf(szMsg, "Result: %d", g_nData);
    MessageBox(NULL, szMsg, "MainThread", MB_ICONINFORMATION);
    return 0;
}

大家自己编译运行这个程序就会发现, 如果不使用TLS, 那么结果都是10; 如果使用TLS, 那么主, 助线程的结果将各不影响. 这下你该知道TLS是怎么回事了吧. J

当然, 更复杂的TLS, 就会需要用到Windows TLS的API: TlsAlloc, TlsFree, TlsSetValue, TlsGetValue了; 进一步还需要同步互斥等等.

转:http://blog.csdn.net/apemancsdn/article/details/85870
分享到:
评论

相关推荐

    [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]

    【并发并行】_【C/C++]_【使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例】 在多线程编程中,线程本地存储(Thread Local Storage,简称TLS)是一种用于存储线程私有数据的技术。每个线程都有...

    tls.rar_TLS_Thread Local Storage_thread local

    在IT领域,线程本地存储(TLS,Thread Local Storage)是一种编程技术,它允许程序为每个线程维护独立的数据副本。这种技术在多线程环境中非常有用,因为它避免了数据竞争,提高了并发性能,同时也提供了数据隔离。...

    TLS_TEST.rar_TLS_Thread Local Storage

    描述中提到的“线程局部存储”(TLS,也常被误解为Thread Local Storage)是编程语言中一个重要的特性,特别是在多线程环境下。它允许每个线程拥有自己独立的变量副本,这些副本只对创建它们的线程可见,避免了在...

    tls线程本地存储例子

    标题中的“tls线程本地存储”指的是在编程中,特别是在多线程环境下,使用Thread Local Storage(TLS)来实现线程私有的数据存储。TLS允许每个线程拥有自己的变量副本,确保了数据的安全性和隔离性,避免了在多线程...

    TLS.rar_Thread Local Storage

    线程局部存储(thread-local storage, TLS)是一个使用很方便的存储线程局部数据的系统。利用TLS机制可以为进程中所有的线程关联若干个数据,各个线程通过由TLS分配的全局索引来访问与 自己关联的数据。这样,每个...

    Dynamic-TLS.rar_DynamicTLS_线程 TLS

    在Windows操作系统中,线程局部存储(Thread Local Storage,简称TLS)是一种高效且灵活的机制,它允许每个线程拥有自己的变量副本,而这些副本彼此独立,不会互相干扰。本文将深入探讨如何在Windows环境下使用动态...

    thread-local-storage.pdf

    线程局部存储(Thread-Local Storage,TLS)是多线程编程中的一种技术,用于在每个线程中维护独立的数据副本,避免了数据共享带来的同步问题。在描述的文档"thread_local_storage.pdf"中,作者Ulrich Drepper探讨了...

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

    线程局部存储(TLS,Thread Local Storage)是C++中一种用于在线程间隔离数据的机制,它允许每个线程拥有自己独立的数据副本,而不会互相干扰。在多线程编程中,TLS常用于存储线程特有的数据,如线程ID、线程初始化...

    线程局部存储机制总结

    线程局部存储(Thread Local Storage,简称TLS)是一种编程技术,允许程序为每个线程分配独立的内存空间。这些空间只对该线程可见,其他线程无法直接访问。这一特性在多线程环境中特别有用,因为它可以避免多个线程...

    android TLS

    在Android系统中,TLS(Thread-Local Storage)是一种机制,用于在多线程环境中为每个线程维护独立的数据存储。这种存储方式确保了每个线程都有自己的数据副本,避免了传统全局变量在并发访问时可能出现的竞态条件和...

    MFC局部线程存储

    在多线程编程中,局部线程存储(TLS,Thread Local Storage)是一种关键的概念,它允许每个线程拥有自己的变量副本,确保了数据的安全性和线程间隔离。 MFC中的局部线程存储主要通过`CWinThread`类以及相关的API...

    线程存储和共享内存

    线程局部存储(Thread Local Storage,TLS)则是针对线程的数据独立性提出的解决方案。与进程不同,线程是进程内的执行单元,它们共享进程的内存空间。但在某些情况下,我们也需要为线程维护私有数据,这就需要用到...

    DLL通过TLS全局变量处理,dll源码

    DLL通过TLS(Thread Local Storage)全局变量处理是一种解决多线程环境中全局变量互相干扰问题的技术。这篇文档将深入探讨DLL、TLS以及它们在C/C++编程中的应用。 首先,DLL是Windows平台上的一个核心特性,它使得...

    MFC.rar_MFC线程_线程局部存储

    在MFC中,线程是并发执行的程序实体,而线程局部存储(TLS, Thread Local Storage)则是一种特殊的数据存储机制,允许每个线程拥有独立的数据副本。 线程是操作系统分配CPU时间的基本单元,多个线程可以在同一进程...

    tls.rar_TLS

    在x86架构上实现TLS,开发者需要考虑线程局部存储模型,如IA-32的Thread Local Storage Index Register (TSR) 或x86_64的Thread Pointer (RTP)。TLS允许每个线程拥有自己的数据副本,而无需全局同步,这在多线程环境...

    TLS.rar_PE TLS

    PE TLS”指的是与PE(Portable Executable)文件格式相关的TLS(Transport Layer Security)技术,但这里的TLS并非我们通常理解的网络通信安全协议,而是PE文件中的一个特性,即“线程局部存储”(Thread Local ...

    class_thread.zip_window thread_windows多线程源码

    此外,Windows还提供了线程局部存储(TLS,Thread Local Storage),允许每个线程拥有自己的变量副本,避免了多线程环境中的数据共享问题。可以使用`TlsAlloc`分配TLS索引,然后通过`TlsSetValue`和`TlsGetValue`...

Global site tag (gtag.js) - Google Analytics