线程特定数据与线程本地存储
Thread Specific Data vs Thread Local Storage
我读过Kerrisk的《Linux编程接口:Linux和UNIX系统编程手册》,第31章线程。本章包括线程特定数据(第31.3.4节)和线程本地存储(第31.4节)。这些主题在第663-669页介绍。
线程特定数据(pthread_key_create
、pthread_setspecific
、pthread_getspecific
和friends)看起来更强大,但使用起来似乎有点麻烦,并且似乎更频繁地使用内存管理器。
线程本地存储(静态和全局声明中的__thread
)看起来功能稍差,因为它的编译时间有限,但它似乎更容易使用,并且在运行时似乎不在内存管理器中。
我对运行时内存管理器的看法可能是错误的,因为可能有代码在遇到__thread
变量时调用pthread_key_create
。
Kerrisk没有对这两种策略进行比较/对比,也没有就在特定情况下何时使用这一策略提出建议。
为问题添加上下文:我正在评估第三方图书馆。该库使用全局变量,是否使用锁定,我想在多线程程序中使用它。该程序使用线程来最大限度地减少网络延迟。
有一个轻而易举的赢家吗?或者有没有不同的场景需要使用其中一种或另一种?
pthread_key_create
和朋友的年龄要大得多,因此在更多的系统上受到支持。
__thread
是一个相对较新的版本,通常使用起来更方便,并且(根据维基百科)在大多数仍然重要的POSIX系统上都得到支持:Solaris Studio C/C++、IBM XL C/C++、GNU C、Clang和英特尔C++编译器(Linux系统)。
__thread
还有一个显著的优点,它可以从信号处理程序中使用(除了使用dlopen
ed共享库中的__thread
,请参阅此错误),因为它的使用不涉及malloc
(同样的例外)。
pthread接口是POSIX标准,因此它们更具可移植性。如果您打算在linux系统之外的其他系统上使用这些代码,请使用它们。另一方面,如果您严格使用gcc/linux,那么__thread机制肯定更容易使用。请注意,它是一个特定于gcc的扩展,并非所有平台都支持它。
- 将线程中的数据存储到全局容器的最佳方法?
- C++ 多线程原子加载/存储
- 混合 c++ 和 .net 的线程本地存储
- 存储/传递 v8 承诺解析器供以后使用的最佳实践?(结合C++线程)
- 线程上下文上的静态存储对象优化
- 在容器中存储指向对象的指针时的线程安全
- 多线程存储到文件中
- 如何使一个线程中的内存存储"promptly"在其他线程中可见?
- 创建一个以存储线程并调用它们的类
- Apache 崩溃并显示错误 R6016 没有足够的空间来存储线程数据
- Valgrind:在多线程程序中发现冲突的存储/加载
- C 静态与线程存储持续时间破坏顺序
- 线程特定数据与线程本地存储
- 多个动态链接库(DLL)是否可以从静态库(LIB)共享线程本地存储
- 线程本地存储(TLS)和OpenMP
- 线程本地存储构造函数 g++
- 在C++中将所有TLS(线程本地存储)变量设置为新的单个值
- 如何确保变量在不同的线程读取它们之前存储到内存中
- 是块作用域静态或线程存储持续时间变量初始化失败的原因
- 基于UNIX的聊天室::使用getch()、POSIX线程存储每个字符