14

我已经阅读了 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在静态和全局声明上)看起来不太强大,因为它受限于编译时间,但它似乎更易于使用,并且在运行时似乎远离内存管理器。

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

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

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

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

4

2 回答 2

12

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

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

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

于 2014-01-12T17:54:06.340 回答
1

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

于 2014-01-09T14:10:53.993 回答