我有一个名为 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_ptr
在 boost::thread
)
关于c++ - boost::thread_specific_ptr 相对于简单的 TlsGetValue 和 TlsSetValue 大幅减慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23219539/