线程特定数据与线程本地存储

Thread Specific Data vs Thread Local Storage

本文关键字:线程 存储 数据      更新时间:2023-10-16

我读过Kerrisk的《Linux编程接口:Linux和UNIX系统编程手册》,第31章线程。本章包括线程特定数据(第31.3.4节)和线程本地存储(第31.4节)。这些主题在第663-669页介绍。

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

线程本地存储(静态和全局声明中的__thread)看起来功能稍差,因为它的编译时间有限,但它似乎更容易使用,并且在运行时似乎不在内存管理器中。

我对运行时内存管理器的看法可能是错误的,因为可能有代码在遇到__thread变量时调用pthread_key_create

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

为问题添加上下文:我正在评估第三方图书馆。该库使用全局变量,是否使用锁定,我想在多线程程序中使用它。该程序使用线程来最大限度地减少网络延迟。

有一个轻而易举的赢家吗?或者有没有不同的场景需要使用其中一种或另一种?

pthread_key_create和朋友的年龄要大得多,因此在更多的系统上受到支持。

__thread是一个相对较新的版本,通常使用起来更方便,并且(根据维基百科)在大多数仍然重要的POSIX系统上都得到支持:Solaris Studio C/C++、IBM XL C/C++、GNU C、Clang和英特尔C++编译器(Linux系统)。

__thread还有一个显著的优点,它可以从信号处理程序中使用(除了使用dlopened共享库中的__thread,请参阅此错误),因为它的使用不涉及malloc(同样的例外)。

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