9

我读过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没有提供两种策略的比较/对比,并且他没有提出在特定情况下何时使用哪种策略的建议。

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

有没有一个传手赢家?还是有不同的情况下使用其中一种?

+1

通常最好不要使用。你为什么要使用它? –

+0

谢谢大卫。它是一个基于网络的多线程程序,可帮助在面对延迟时保持吞吐量。我想尝试解析第三方库,但该库使用状态的静态全局变量。 – jww

+1

嗯,凌乱。我可以看到你来自哪里。理想世界具有通过参数传递的信息。也许考虑一个更线程友好的库? –

回答

6

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

__thread是一个相对较新的,通常是方便多了使用,(according to Wikipedia)支持大多数POSIX系统仍然件事:的Solaris Studio的C/C++,IBM XL C/C++,GNU C,锵和英特尔C++编译。(Linux系统)

__thread还具有显著优点,即它是从信号处理程序使用(使用__threaddlopen编共享库的异常,请参阅本bug),因为它的使用不涉及malloc(具有相同的例外)

+0

另请参阅https://blogs.oracle.com/seongbae/entry/pthread_get_set_specific_vs。 'pthread_key_create()'的一个限制是调用不保证总是返回成功。这使得这些调用在'__init'类型函数中不可用,而没有做出一些假设。因此,'__thread'是线程特定数据的简单且有保证的方式。 – ReddyVeeru

1

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

+2

尽管如此,C++ 11有一个''thread_local'说明符,它类似于'__thread',并且这应该最终得到支持。 –

+0

'__thread'不是* GCC特有的扩展 - 它现在几乎所有的UNIX编译器都支持它。 –