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

时间:2014-01-09 09:05:03

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

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

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

线程本地存储(__thread关于静态和全局声明)看起来有点不那么强大,因为它仅限于编译时间,但它看起来更容易使用,并且似乎在运行时不在内存管理器中

运行时内存管理器可能有问题,因为在遇到pthread_key_create变量时,可能会在幕后调用__thread

Kerrisk没有提供两种策略的比较/对比,他没有就何时使用哪种策略提出建议。

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

是否有一手牌获胜者?或者有不同的情况需要使用其中一种吗?

2 个答案:

答案 0 :(得分:9)

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

__thread是一个相对新手,通常更方便使用,并且大多数POSIX系统都支持according to Wikipedia):Solaris Studio C / C ++,IBM XL C / C ++,GNU C,Clang和Intel C ++编译器(Linux系统)。

__thread还有一个明显的优势,即它可以从信号处理程序中使用(除了使用__thread ed共享库中的dlopen,请参阅此bug) ,因为它的使用不涉及malloc(具有相同的例外)。

答案 1 :(得分:1)

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