访问冲突异常后,线程本地存储已损坏

时间:2014-08-04 11:48:25

标签: c++ multithreading winapi thread-local thread-local-storage

我有一些数据存储在线程本地存储中。基本上我有一个每个线程存储在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崩溃。

我们无法弄清楚导致腐败的原因。有关调试此类问题的任何建议。

0 个答案:

没有答案