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的这种正确行为是为了避免这种崩溃吗?
答案 0 :(得分:1)
不,这不是正确的方法,因为它不保护线程2在线程1调用MyFunction之前删除对象的场景。
您的代码目前有Dangling Pointer个错误。
正确的解决方案是修改代码以确保在没有其他线程可以使用它时删除对象。常见的方法包括: