C++ 如何";试试“U锁”;一个递归互斥锁,以避免在销毁过程中崩溃
我有一个类,它使用计时器不断地进行rest调用,这些rest调用的结果被发送回类中,然后再进行处理。 问题是,如果在更新过程中调用此类的析构函数,则会导致崩溃。 我试图通过使用递归互斥来解决这个问题C++ 如何";试试“U锁”;一个递归互斥锁,以避免在销毁过程中崩溃,c++,qt,C++,Qt,我有一个类,它使用计时器不断地进行rest调用,这些rest调用的结果被发送回类中,然后再进行处理。 问题是,如果在更新过程中调用此类的析构函数,则会导致崩溃。 我试图通过使用递归互斥来解决这个问题 private: QTimer* m_Timer = nullptr; std::recursive_mutex m_RecursiveMutex; 在析构函数
private:
QTimer* m_Timer = nullptr;
std::recursive_mutex m_RecursiveMutex;
在析构函数上放置一个锁调用,并尝试锁定更新函数的开始
Class::~Destructor()
{
std::lock_guard<std::recursive_mutex> lock(m_RecursiveMutex);
m_Timer->stop();
delete m_Timer;
}
void Class::UpdateSelf(GetInfoResponse res)
{
if (m_RecursiveMutex.try_lock())
{
... do stuff
}
}
Class::~Destructor()
{
std::lock_guard lock(m_RecursiveMutex);
m_定时器->停止();
删除m_定时器;
}
void类::UpdateSelf(GetInfoResponse res)
{
if(m_RecursiveMutex.try_lock())
{
…做事
}
}
然而,这似乎没有改变任何事情,因为update函数仍然会被调用并导致程序崩溃,我不知道我做错了什么,所以我很感激任何输入。您的代码实际使用线程吗?我想你最好尝试去理解最初崩溃的原因,而不是尝试用互斥来修复问题。另外,只需将
m_Timer
设为QTimer
而不是QTimer*
——实际上不需要管理其堆分配/删除的额外复杂性。不管对象是否存在,都可以调用该对象,这一事实告诉我,互斥锁在这里不是问题。调试代码并分析对象生存期。为什么在已经调用析构函数之后才使用它?听起来您的错误是从线程A中删除类
对象,而线程B仍然可能访问类
对象。简单地添加互斥不能解决这个问题;在线程a删除对象之前,您需要想出一种方法来保证线程B不再能够访问该对象。大锤方法是线程A告诉线程B退出,然后线程A调用wait()/join()阻止,直到线程B实际退出,然后线程A删除对象,然后(可选)线程A生成一个新线程B。