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