c++ - boost::thread_specific_ptr 相对于简单的 TlsGetValue 和 TlsSetValue 大幅减慢

标签 c++ windows boost

我有一个名为 WCThreadSpecificPrivateData 的小类。 它的实现:

class WCThreadSpecificPrivateData
{
public:
    WCThreadSpecificPrivateData();
    ~WCThreadSpecificPrivateData();

    void* GetData();
    void  SetData(void*);

protected:
    uint32_t m_DataKey;
};

WCThreadSpecificPrivateData::WCThreadSpecificPrivateData():m_DataKey(0)
{
    m_DataKey = ::TlsAlloc();
}

void* WCThreadSpecificPrivateData::GetData()
{
    void* retVal = 0;

    if (0 != m_DataKey)
        retVal = ::TlsGetValue(m_DataKey);
    return retVal;
}

void  WCThreadSpecificPrivateData::SetData(void* in_data)
{
    if (0 != m_DataKey)
        ::TlsSetValue(m_DataKey, in_data);
}

我用它来存储指向名为 TargetSpecificData 的线程特定结构的指针。 在某些时候,我决定使用 boost::thread_specific_ptr 代替此类。它对我有用,但是,我的性能急剧下降。一切都变得更慢了。

我检查了 boost 实现(对于 Windows),发现它也是通过 TlsGetValue 和 TlsSetValue 调用实现的,所以我预计会有大致相同的行为。有人可以提出导致这种下降的原因吗?

最佳答案

我不能给你很多想法“是什么导致了这样的下降”,主要是因为你没有展示你如何使用 thread_specific_ptr

此外,考虑仅使用 thread_local (c++11),因为大多数编译器现在“大致”支持它。 (有一些小的限制,主要是非平凡类型的静态初始化)。没有什么不能用 lambda 初始化器解决的:

thread_local std::unique_ptr<my_thing> thing = 
         [] { return new std::unique_ptr<my_thing>(); }();

更新 事实上,可能有一个原因:如果您正在创建许多线程(并让它们运行完成),可能会有更多的破坏(boost::thread_specific_ptrboost::thread)

的导出处破坏包含的实体

关于c++ - boost::thread_specific_ptr 相对于简单的 TlsGetValue 和 TlsSetValue 大幅减慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23219539/

相关文章:

c++ - 如何在 C++ 'for' 循环中放置两个增量语句?

c - C中的fread错误

c++ - 将 lexical_cast 用于无符号类型时检查负值

c++ - 是否有 C 的 "memcmp"的 native C++ 替代品?

boost - 对象 boost::asio::io_service 的方法 post() 是否使用 boost::coroutines 来执行短任务?

c++ - 如何改变QTableWidget垂直表头的背景颜色?

c++ - 将 RTTI 与普通旧结构 (gcc) 结合使用

c# - Windows 不变文化之谜

c++ - 成员函数声明的奇怪错误

c++ - 使用 Qt 以不同的方法线程化