c++编译器如何在C++0x中实现线程本地存储
我在谷歌上搜索了这个问题,但是没有找到相关的内容。
有没有人有关于这个问题的资料?
c++编译器如何在C++0x中实现线程本地存储
我在谷歌上搜索了这个问题,但是没有找到相关的内容。
有没有人有关于这个问题的资料?
请阅读维基百科条目。
线程本地存储并不是特定于C ++的。有时它会有不同的名称,比如“TLS”(只是线程本地存储的缩写),或者“线程特定存储”(TSS)。
大多数操作系统提供API来访问每个线程的存储空间。例如,Windows有一些以“TLS”开头的API函数集合。在幕后,Win32为各种线程数据保留了一个特殊区域,包括用户线程本地存储,通过特定的CPU寄存器(x86上的FS)可访问。Linux通过pthread API提供线程特定存储,其名称类似于pthread_key_create,并且通常使用类似的技术实现。
可能某些操作系统根本不提供任何支持。但是,如果操作系统通过API提供了进程唯一的线程ID,则C ++运行时库可以在内部维护类似于std :: map<thread_id,per_thread_storage>
的东西。当然,然后就出现了per_thread_storage
是什么的问题。如果程序是静态链接的,则可以将其视为指向程序中声明为元素的所有线程本地存储变量的大型结构体的指针。这是一个过度简化,但您可以得到一般想法。
访问线程本地存储变量显然不仅仅是直接的内存读写。它可能会涉及到更多的操作。如果您在特定函数中要频繁使用线程本地/特定存储,请先将线程本地存储指针复制到本地变量中。
thread_local
关键字,它确保为每个线程创建单独的全局变量实例。问题在于每个线程需要加载不同的块。 thread_local
变量。 void *
值,该值可用于存储已在进程堆上分配的线程本地块的指针。