在析构函数中锁定和取消锁定CriticalSection以避免崩溃是正确的方法吗?

时间:2013-08-22 13:28:37

标签: multithreading mfc critical-section

class MyClass
{
   ...
   ...
   CCriticalSection m_Cs;

   void MyFunction()
   {
      m_Cs.Lock();

      .....

      m_Cs.Unlock(); 


   }

   MyClass::~MyClass()
   {
     ....

   }
};

我在上课中使用Critical Section,myFunction由Thread 1调用,当myFunction正在进行时,Thread 2正在删除该对象。所以Unlock正在崩溃。

所以我决定修改MyClass析构函数,如下所示

 MyClass::~MyClass()
  {

     m_Cs.Lock();
     m_Cs.Unlock(); 
     ....

  }

这解决了我的崩溃,因为当线程1访问MyFunction时,CriticalSection被锁定,因此当从线程2中删除对象时,析构函数中的CriticalSection.Lock将被阻止,直到从MyFunction调用unlock。从析构函数中锁定和解除CriticalLction的这种正确行为是为了避免这种崩溃吗?

1 个答案:

答案 0 :(得分:1)

不,这不是正确的方法,因为它不保护线程2在线程1调用MyFunction之前删除对象的场景。

您的代码目前有Dangling Pointer个错误。

正确的解决方案是修改代码以确保在没有其他线程可以使用它时删除对象。常见的方法包括:

  • 使用事件来指示何时使用该对象完成线程,执行删除的线程将阻止所有人说它们已完成。
  • 使用引用计数。让每个使用该对象的线程“获取”并“释放”该对象。释放它的最后一个(例如,当引用计数达到0时)然后让对象自行删除。