Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在流行的现代操作系统中,线程本地存储是否存在已知的大小限制?_C++_C_Multithreading_Thread Local Storage - Fatal编程技术网

C++ 在流行的现代操作系统中,线程本地存储是否存在已知的大小限制?

C++ 在流行的现代操作系统中,线程本地存储是否存在已知的大小限制?,c++,c,multithreading,thread-local-storage,C++,C,Multithreading,Thread Local Storage,当我使用thread\u local、\u thread\u local、\u thread或\u declspec(thread),编译器似乎会在线程创建时分配线程本地存储,并将地址存储在x86派生系统中的fs或gs寄存器中 在这种情况下,是否存在类似“线程本地存储溢出”的情况?存在一些限制。每个系统都会有所不同,但在Windows上,有一个有限的数据部分专门映射到线程。这一部分的规模有限 旧版本的windows直接使用此功能,并且在创建新项目时会失败 上次我在Windows 7+上检查时,这

当我使用
thread\u local
\u thread\u local
\u thread
\u declspec(thread)
,编译器似乎会在线程创建时分配线程本地存储,并将地址存储在x86派生系统中的
fs
gs
寄存器中


在这种情况下,是否存在类似“线程本地存储溢出”的情况?

存在一些限制。每个系统都会有所不同,但在Windows上,有一个有限的数据部分专门映射到线程。这一部分的规模有限

旧版本的windows直接使用此功能,并且在创建新项目时会失败

上次我在Windows 7+上检查时,这已经消失了(操作系统对整个DLL使用1个插槽-作为对线程本地映射的重定向),但是有一个不同的限制,它限制了可用的唯一插槽的数量。加载的每个DLL都使用一个插槽,因此可以使用线程本地存储的DLL数量有限制


另请参见

对于具有静态存储持续时间的变量(即全局变量),除了相同的限制之外,没有其他限制。TLS数据最终在堆上,但由于整个TLS部分必须连续分配,因此当堆碎片化时,大型TLS部分可能会出现问题。@fuzzxl:“连续分配”听起来像是一个特定的实现。我认为TLS段的链接列表没有问题。假设我们有4K TLS页面,每个页面上的最后一个指针指向下一个段。TLS变量通常已表示为偏移量,唯一的变化是,对于大于4kB的TLS偏移量,我们从偏移量中减去4kB,然后(递归地)在下一个TLS页面中查找它。@mAlters您可以这样做,但这样的实现速度会非常慢,因此没有人这样做。@fuzzxl:没错,链表不是最快的数据结构,但用一个600字符的注释来描述它是最容易的,它显示了多个实现以及非连续分配都是可能的。@MSalters是的,其他实现也是可能的,但没有人以这种方式实现TLS。我上面的评论涉及线程本地存储的实际实现,而不是专门用来反驳我的面向应用程序的评论的设计。如果这是关于理论的,你是对的,但这是关于工程的,实际上所做的事情比标准的理论范围更重要。