multithreading - gcc __thread 做什么?

标签 multithreading gcc

我真的很困惑 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/

相关文章:

c - 为什么用 1 和 0 初始化数组会使可执行文件如此之大?

r - 升级到 Mac OS Catalina 后可能无法安装各种 R 软件包

c++ - 将不同的 C++ 标准与 GCC 混合

python - 如何为不同Python进程之间的不同神经网络设置共享权重?

c++ - 在 C++ 异常的 what() 中构建字符串

c# - 创建线程前台 VS Thread.Join()

c# - 异步任务同步

c++ - std::thread 导致应用程序中止并出现错误 R6010

c++ - 为什么 GCC 交叉编译器不能找到所有的库?

c++ - 当函数在 GCC 中没有任何返回值时,如何强制执行错误?