我有一些数据存储在线程本地存储中。基本上我有一个每个线程存储在TLS中的某种属性。在TLS中,我们放置了自定义类对象实例CMyAttributes *。
这是一个引用计数属性持有者
举个例子:
CMyAttributes* CMyAttributes::GetInstance()
{
ThreadStorage& tls = GetThreadLocalStorage();
CMyAttributes* pMyAttributes = reinterpret_cast<CMyAttributes*>(tls.Get());
if (pMyAttributes == nullptr)
{
pMyAttributes = new CMyAttributes();
pMyAttributes->AddRef();
tls.Set(pMyAttributes);
}
pMyAttributes->AddRef();
return pMyAttributes;
}
重写AddRef和Release。这个类是参考计数。在对象被销毁时,我们通过调用tls.Set(nullptr)来清除TLS。
现在我们面临的问题是,当存在访问冲突异常时,我们会发现线程本地存储已损坏。也就是说,当我们调用GetInstance调用时,我们看到TLS具有垃圾值,并且pMyAttributes不为null并且Addref崩溃。
我们无法弄清楚导致腐败的原因。有关调试此类问题的任何建议。