我读过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没有提供这两种策略的比较/对比,他也没有就在给定的情况下使用哪种策略提出建议。
为问题添加上下文:我正在评估一个第三方库。库使用全局,不使用锁定,我想在多线程程序中使用它。该程序使用线程来最小化网络延迟。
有胜利者吗?或者,是否有不同的场景需要使用其中一种?
发布于 2014-01-12 17:54:06
pthread_key_create和朋友更老了,因此在更多的系统上得到了支持。
__thread相对较新,通常使用起来更加方便,并且(根据维基百科)在大多数仍然重要的POSIX系统上得到了支持: Solaris Studio C/ C ++、IBM / C++、GNU、Clang和Intel C++编译器(Linux ))。
__thread还有一个显著的优点,它可以从信号处理程序中使用(除了使用来自dlopened共享库的__thread (请参阅此错误) ),因为它的使用不涉及malloc (除了相同的例外)。
发布于 2014-01-09 14:10:53
线程接口是POSIX标准,因此它们更易于移植。如果您打算在linux系统之外的东西上使用代码,请使用它们。另一方面,如果您严格使用gcc/linux,那么__thread机制肯定更容易使用。请注意,这是gcc特有的扩展,不是所有平台都支持的。
https://stackoverflow.com/questions/21015738
复制相似问题