为什么我们需要 boost::thread_specific_ptr?

3
我们为什么需要boost :: thread_specific_ptr,或者换句话说,没有它我们很难做到什么?
我可以看出pthread为什么提供pthread_getspecific()等函数。这些函数对于清理死亡线程非常有用,并且方便从C风格的函数调用(明显的替代方案是在创建线程之前传递指向某些内存的指针)。
相比之下,boost:thread的构造函数通过值获取可调用类,并且一旦复制,该类中的所有非静态内容都会变为线程本地。我看不出为什么我想要使用boost :: thread_specific_ptr而不是类成员,就像我不想在OOP代码中使用全局变量一样。
我是否完全误解了任何东西?请给一个非常简短的示例。非常感谢。
1个回答

2
thread_specific_ptr 提供了便携式的线程本地数据访问。即使您不使用Boost.Thread来管理线程,也可以从中获得价值。这个类在Boost文档中引用的规范示例是:

一个示例是C语言标准库函数相关的错误代码存储变量C errno。为了避免不同线程竞争读取或更新值,支持多线程应用程序的编译器通常会为每个线程提供一个单独的errno实例,这是一种通用做法(并且POSIX要求如此)。


@Steve Townsend:非常好的观点,非常感谢你的回答。那么重新表述一下,我想问是否有任何理由同时使用 boost::thread 和 boost::thread_specific_ptr? - Joe
@Andy:我不明白。据我所知,TLS可以帮助您避免传递额外的指针,并在之后进行清理。您是否有类似于此的想法,或者您是指速度优化?如果是后者,请简要解释一下加速来自哪里? - Joe
1
想象一下,您有使用OpenMP的可并行化代码。该代码可以使用类型为thread_specific_ptr的变量来处理其上下文,而无需使用boost::thread进行线程管理的开销。 - Steve Townsend
@Andy:非常感谢。我可以看出为每个线程设置一个分配池是一件好事。但我不明白这比在创建线程时为每个线程分配一个池提供了更快的速度。换句话说,既然用户空间也能实现相同的效果,为什么Linux内核要支持TLS呢? - Joe
TLS的主要优势在于它允许您存储来自不负责线程生命周期的代码的每个线程数据。如果您可以在线程创建时分配内存,那么请务必这样做--这更好。但有时(由于代码结构,例如成为库),这是不可能的,这就是TLS发挥作用的地方。 - Miral
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接