我真的很困惑gcc __thread
的关键字在后面做了什么。
有人可以给我一些信息吗?
答案 0 :(得分:2)
它以与{C ++ 11 thread_local
关键字相同的方式将变量声明为thread local,重要的区别是thread_local
允许静态初始化而__thread
没有。
执行静态初始化的能力可能会产生明显的性能影响(每次访问的函数调用),如this answer中所述。
本地线程意味着访问此变量的每个线程都会看到一个单独的不同变量,就好像它们确实是具有不同名称的变量一样(尽管它们在源级别上是相同的名称)。
编译器实现此目的的确切方式是实现定义和平台相关。典型的实现(不同版本的GCC之间的不同)包括调用例如Linux下的get_thread_area
和Windows下的TlsAlloc
/ TlsGetValue
,只有在第一次访问(Linux)时才有相当大的开销,但是#34;免费"否则,或每次访问都有明显的开销(Windows)
替代方案包括从线程环境块获取指针并执行表查找(也就是TlsGetValue
函数在内部执行的操作)或者具有单独的可写静态数据段,该段在访问时按线程选择(这具有已经完成了多年来实现例如errno
的工作,或者只是在程序启动时在堆栈底部保留一个小区域,因为堆栈上的任何东西都是定义为线程本地的。
您的特定编译器版本使用的方法是您只能通过编译和反汇编程序(或通过挖掘编译器源)才能知道的。 您将遇到的开销范围可以是"只有两个内存acesses而不是一个"一个函数调用后跟一两条指令,甚至是最坏情况下的系统调用。