gpt4 book ai didi

multithreading - gcc __thread 做什么?

转载 作者:行者123 更新时间:2023-12-03 12:46:02 30 4
gpt4 key购买 nike

我真的很困惑 gcc __thread 的关键字在背后做了什么。

谁能给我一些信息?

最佳答案

它将变量声明为 thread local与 C++11 thread_local 关键字的方式非常相似,重要的区别在于 thread_local 允许静态初始化,而 __thread 则不允许。< br/>如 this answer 中所述,执行静态初始化的能力可能会对性能产生显着影响(每次访问的函数调用)。 .

线程本地意味着访问此变量的每个线程都将看到一个单独的、不同的变量,就好像它们确实是具有不同名称的变量一样(尽管它们在源代码级别上是相同的名称)。

编译器究竟做了什么来实现它是实现定义的和平台相关的。典型的实现(不同版本的 GCC 之间不同)包括调用例如Linux 下的 get_thread_area 和 Windows 下的 TlsAlloc/TlsGetValue,这仅在首次访问 (Linux) 时具有相当大的开销,但在其他情况下是“免费的”,或每次访问时的明显开销 (Windows)。
备选方案包括从线程环境 block 获取指针并进行表查找(这也是 TlsGetValue 函数在内部执行的操作)或拥有一个单独的可写静态数据段,该段在访问时按线程选择(这就是多年来为实现 errno 所做的工作),或者只是在程序启动时在堆栈底部保留一个小区域,因为堆栈上的任何内容根据定义都是线程本地的.

您的特定编译器版本究竟使用哪种方法只有通过编译和反汇编程序(或通过挖掘编译器源代码)才能知道。
您将遇到的开销范围可能从“仅两次内存访问而不是一次”到一个函数调用后跟一两打指令,甚至在最坏的情况下是一个系统调用。

关于multithreading - gcc __thread 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523480/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com