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

   void MyFunction()
   {
      m_Cs.Lock();

      .....

      m_Cs.Unlock(); 


   }

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

   }
};

如上所述,我在我的类中使用关键部分,myFunction 由线程 1 调用,当 myFunction 正在进行时,线程 2 正在删除对象。所以Unlock崩溃了。

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

 MyClass::~MyClass()
  {

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

  }

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

4

1 回答 1

1

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

您当前的代码中有一个悬空指针错误。

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

  • 当线程使用对象完成时,使用事件发出信号,执行删除的线程将阻塞等待每个人都说他们完成了。
  • 使用引用计数。让每个使用对象的线程“获取”和“释放”对象。最后一个释放它的对象(例如,当引用计数达到 0 时)然后让对象自己删除。
于 2013-08-22T15:54:58.003 回答