【问题标题】:Thread Specific Data vs Thread Local Storage线程特定数据与线程本地存储
【发布时间】:2014-01-09 09:05:03
【问题描述】:

我读过 Kerrisk 的 The Linux Programming Interface: A Linux and UNIX System Programming Handbook,第 31 章关于线程。本章包括线程特定数据(第 31.3.4 节)和线程本地存储(第 31.4 节)。第 663-669 页涵盖了这些主题。

线程特定数据(pthread_key_createpthread_setspecificpthread_getspecific 和朋友)看起来更强大,但似乎使用起来有点麻烦,并且似乎更频繁地使用内存管理器。

线程本地存储(__thread 在静态和全局声明上)由于受限于编译时间,看起来功能稍逊一筹,但它似乎更易于使用,并且在运行时似乎不受内存管理器的影响。

我可能对运行时内存管理器有误,因为当遇到__thread 变量时,可能会有调用pthread_key_create 的幕后代码。

Kerrisk 没有提供两种策略的比较/对比,也没有就在特定情况下何时使用哪种策略提出建议。

为问题添加上下文:我正在评估第 3 方库。该库使用全局变量,not 是否使用锁定,我想在多线程程序中使用它。该程序使用线程来最小化网络延迟。

有没有一个不折不扣的赢家?或者是否有不同的场景需要使用其中一种?

【问题讨论】:

  • 一般情况下最好都不使用。你为什么要使用它?
  • 谢谢大卫。它是一个基于网络的多线程程序,可帮助在面对延迟时保持吞吐量。我想尝试使用第 3 方库进行解析,但该库使用静态全局变量进行状态。
  • 嗯,乱七八糟。我可以看到你来自哪里。理想世界有参数传递的信息。也许考虑一个对线程更友好的库?

标签: c++ c pthreads thread-local-storage thread-specific-storage


【解决方案1】:

pthread_key_create 和朋友年龄更大,因此支持更多系统。

__thread 相对较新,使用起来通常更方便,并且(according to Wikipedia) 支持大多数仍然重要的 POSIX 系统:Solaris Studio C/C++、IBM XL C/C++、GNU C、Clang 和 Intel C++ 编译器(Linux 系统)。

__thread 也有一个显着的优势,即它可以从信号处理程序中使用(除了使用来自dlopened 共享库的__thread,参见这个bug),因为它的使用不涉及@ 987654329@(同样的例外)。

【讨论】:

  • 另见blogs.oracle.com/seongbae/entry/pthread_get_set_specific_vspthread_key_create() 的一个限制是不能保证调用总是返回成功。这使得这些调用在 __init 类型函数中无法使用,而无需做出一些假设。因此,__thread 是线程特定数据的简单且有保证的方式。
【解决方案2】:

pthread 接口是 POSIX 标准的,因此它们更具可移植性。如果您打算在除 linux 系统之外的其他东西上使用代码,请使用它们。另一方面,如果你严格使用 gcc/linux,那么 __thread 机制肯定更容易使用。请注意,它是 gcc 特定的扩展,并非所有平台都支持。

【讨论】:

  • C++11 有一个 thread_local 说明符,它与 __thread 类似,但最终应该得到所有地方的支持。
  • __thread 不是特定于 GCC 的扩展——它受到当今几乎所有重要的 UNIX 编译器的支持。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多