是否可以通过 thread_local 实现 boost::thread_specific_ptr?

Is it possible to implement boost::thread_specific_ptr via thread_local?

这个问题可能看起来很奇怪。我想这样做是因为我们有一些代码需要在多个平台上构建,但有些平台不支持 thread_local,然后改用 boost::thread_specific_ptr。然而,为每个平台(x86/x64/arm、debug/release、os、太多)构建 boost 二进制文件并不令人愉快。

我想知道 pos 是否可以通过 thread_local imp thread_specific_ptr 以便我们可以使客户端代码更优雅(避免 #ifdef)

我想要一个像这样的头文件:

#if HAS_THREAD_LOCAL
class thread_specific_ptr
{
    ... // use thread_local to implement
};
#else
using boost::thread_specific_ptr
#endif

我找不到路,也许你能找到,谢谢。

可以使用 thread_local 实现 thread_specific_ptr。必须记住的重要部分是 thread_local 是一个存储说明符,而 thread_specific_ptr 是一个对象。因此,从技术上讲,动态创建和销毁 thread_specific_ptr 对象是可行的,而您不能使用 thread_local 对象来做到这一点。例如,您不能将 thread_local 对象作为 class.

的成员

但是,thread_local可以被thread_specific_ptr内部使用到select一个基于当前线程的内部结构。该结构可以包含程序中所有 thread_specific_ptr 的数据,并允许动态创建和删除其元素。例如,可以为此目的使用 std::map

thread_local std::map< void*, std::shared_ptr< void > > thread_specific_ptr_data;

template< typename T >
class thread_specific_ptr
{
public:
    T* get() const
    {
        auto it = thread_specific_ptr_data.find(this);
        if (it != thread_specific_ptr_data.end())
            return static_cast< T* >(it->second.get());
        return nullptr;
    }
};

thread_local 的原始使用相比,这当然会增加一些开销,而且在某些平台上它实际上可能比 boost::thread_specific_ptr 慢一点,因为 boost::thread_specific_ptr 使用较低的-level 接口比 thread_local。您还必须解决 boost::thread_specific_ptr 面临的问题,例如使用什么键来查找地图中的值。但如果您的目标是消除依赖性,这种方法可能会很有用。