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

jww*_*jww 12 c c++ pthreads thread-local-storage thread-specific-storage

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

线程特定数据(pthread_key_create,pthread_setspecific,pthread_getspecific,和朋友)看起来更加强大,但似乎多了几分使用麻烦,并显示使用内存管理器更频繁.

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

关于运行时内存管理器我可能是错的,因为pthread_key_create在遇到__thread变量时可能会在幕后调用代码.

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

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

有没有赢家?或者有不同的情况需要使用其中一种吗?

Emp*_*ian 10

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

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

__thread也有显著的优势在于它是从信号处理程序使用(使用的例外__thread,从dlopen编共享库,看到这个错误),因为它的使用不涉及malloc(具有相同的除外).