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

时间:2014-04-22 12:26:12

标签: 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调用实现的,所以我期望大致相同的行为。有人可以提出导致这种下降的原因吗?

1 个答案:

答案 0 :(得分:1)

我无法给你许多想法"导致这种下降的原因,主要是因为你没有显示你如何使用thread_specific_ptr

另外,考虑使用thread_local(c ++ 11)作为大多数编译器"粗略地"现在支持它。 (有一些小的限制,主要是非平凡类型的静态初始化)。使用lambda-initializer无法解决任何问题:

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

更新实际上,可能有一个原因:如果您创建了许多线程(并让它们运行完成),可能会有更多的破坏(boost::thread_specific_ptr破坏所包含的实体退出boost::thread