在C++多线程中调用非静态成员函数可能会导致崩溃。这是因为非静态成员函数需要访问对象的成员变量和成员函数,而在多线程环境下,访问对象的成员变量和成员函数是不安全的。

为了解决这个问题,可以将非静态成员函数改为静态成员函数,并将对象指针作为参数传入。例如,以下代码展示了如何将MainWindow::updataState函数改为静态成员函数,并在多线程中安全调用它:

class MainWindow {
public:
    static void updataState(MainWindow* pThis);
};

void MainWindow::updataState(MainWindow* pThis){
    qDebug()<'123';
    //发送修改状态的信号
    //emit pThis->sigupdataState();
}

MainWindow* pThis = this;
std::thread t([pThis]{
    FunctionPointer funcPtr = reinterpret_cast<FunctionPointer>(MainWindow::updataState);
    funcPtr(pThis);
});

t.detach();

在这个示例中,updataState函数被声明为静态成员函数,并在调用时传入this指针。这样,updataState函数就可以访问pThis对象中的成员变量和成员函数,从而避免多线程访问冲突导致的崩溃问题。

总结:在多线程环境下,调用非静态成员函数时要注意安全问题。将非静态成员函数改为静态成员函数并传入对象指针是解决这个问题的一种有效方法。


原文地址: https://www.cveoy.top/t/topic/nwCn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录