gcc __thread 是做啥的?
Posted
技术标签:
【中文标题】gcc __thread 是做啥的?【英文标题】:What does gcc __thread do?gcc __thread 是做什么的? 【发布时间】:2015-02-15 06:04:39 【问题描述】:我真的很困惑 gcc __thread
的关键字在背后做了什么。
谁能给我一些信息?
【问题讨论】:
我找到了这篇文章,docs.oracle.com/cd/E19683-01/817-3677/chapter8-1/index.html 【参考方案1】:它将变量声明为 thread local 与 C++11 中的 thread_local
关键字非常相似,重要的区别在于 thread_local
允许静态初始化,而 __thread
不允许。
如this answer 中所述,进行静态初始化的能力可能会对性能产生显着影响(每次访问的函数调用)。
线程本地意味着访问此变量的每个线程都将看到一个单独的不同变量,就好像它们确实是具有不同名称的变量(尽管它们在源级别上是相同的名称)。
编译器实现这一点的具体做法是实现定义和平台相关的。典型的实现(不同版本的 GCC 不同)包括调用例如Linux 下的 get_thread_area
和 Windows 下的 TlsAlloc
/TlsGetValue
,这两种方法的开销要么仅在首次访问 (Linux) 时产生,但在其他情况下是“免费”的,要么在每次访问 (Windows) 时产生显着的开销。
替代方法包括从线程环境块获取指针并进行表查找(这也是TlsGetValue
函数在内部执行的操作)或拥有一个单独的可写静态数据段,在访问时按线程选择(这就是用于实现例如errno
多年),或者只是在程序启动时在堆栈底部保留一个小区域,因为堆栈上的任何内容都定义为线程本地的。
您的特定编译器版本究竟使用了哪种方法,只有通过编译和反汇编程序(或通过挖掘编译器源代码)才能知道。 您将遇到的开销可能范围从“只有两个内存访问而不是一个”到一个函数调用,然后是一到两打指令,甚至在最坏的情况下甚至是一个系统调用。
【讨论】:
以上是关于gcc __thread 是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章
ubuntu里的/usr/lib/x86_64-linux-gnu这个文件夹是做啥的
linux pthreads 上的 gcc 4.7 - 使用 __thread 的重要 thread_local 解决方法(无提升)