Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何";试试“U锁”;一个递归互斥锁,以避免在销毁过程中崩溃_C++_Qt - Fatal编程技术网

C++ 如何";试试“U锁”;一个递归互斥锁,以避免在销毁过程中崩溃

C++ 如何";试试“U锁”;一个递归互斥锁,以避免在销毁过程中崩溃,c++,qt,C++,Qt,我有一个类,它使用计时器不断地进行rest调用,这些rest调用的结果被发送回类中,然后再进行处理。 问题是,如果在更新过程中调用此类的析构函数,则会导致崩溃。 我试图通过使用递归互斥来解决这个问题 private: QTimer* m_Timer = nullptr; std::recursive_mutex m_RecursiveMutex; 在析构函数

我有一个类,它使用计时器不断地进行rest调用,这些rest调用的结果被发送回类中,然后再进行处理。 问题是,如果在更新过程中调用此类的析构函数,则会导致崩溃。 我试图通过使用递归互斥来解决这个问题

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。