我读过关于线程的第31章Kerrisk的The Linux Programming Interface: A Linux and UNIX System Programming Handbook。本章包括线程特定数据(第31.3.4节)和线程本地存储(第31.4节)。第663-669页介绍了这些主题。
线程特定数据(pthread_key_create
,pthread_setspecific
,pthread_getspecific
和朋友)看起来更强大,但使用起来似乎有些麻烦,并且似乎使用了内存管理器更频繁。
线程本地存储(__thread
关于静态和全局声明)看起来有点不那么强大,因为它仅限于编译时间,但它看起来更容易使用,并且似乎在运行时不在内存管理器中
运行时内存管理器可能有问题,因为在遇到pthread_key_create
变量时,可能会在幕后调用__thread
。
Kerrisk没有提供两种策略的比较/对比,他没有就何时使用哪种策略提出建议。
为问题添加上下文:我正在评估第三方库。该库使用全局变量,不使用锁定,我想在多线程程序中使用它。该程序使用线程来最小化网络延迟。
是否有一手牌获胜者?或者有不同的情况需要使用其中一种吗?
答案 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特定的扩展,并不是所有平台都支持。