gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:59:39 25 4
gpt4 key购买 nike

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

我想知道是否可以通过 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 对象作为类的成员。

但是,thread_local 可以被thread_specific_ptr 内部使用,以根据当前线程选择一个内部结构。该结构可以包含程序中所有 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 使用比 thread_local 更低级别的接口(interface)。您还必须解决 boost::thread_specific_ptr 面临的问题,例如使用什么键来查找映射中的值。但如果您的目标是消除依赖性,则此方法会很有用。

关于c++ - 是否可以通过 thread_local 实现 boost::thread_specific_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36301420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com