C++ 使用QtConcurrent::run()修改成员变量?

C++ 使用QtConcurrent::run()修改成员变量?,c++,multithreading,qt,C++,Multithreading,Qt,假设我有一个类MyClass,它包含一个非常复杂且非常慢的slowFunction(),我想在另一个线程中执行该函数,为此我使用了Qtconcurrent::run,下面是一个代码片段: void MyClass::startAnalysis() { //Run slowFunction in another thread QtConcurrent::run(this, &MyClass::slowFunction); } void MyClass:slowFunc

假设我有一个类
MyClass
,它包含一个非常复杂且非常慢的
slowFunction()
,我想在另一个线程中执行该函数,为此我使用了Qtconcurrent::run,下面是一个代码片段:

void MyClass::startAnalysis() {
     //Run slowFunction in another thread
     QtConcurrent::run(this, &MyClass::slowFunction);
}

void MyClass:slowFunction() {
     for(int i = 0; i < 100; i++) {
         qDebug() << this << i;
     }
}
void MyClass::startAnalysis(){
//在另一个线程中运行slowFunction
QtConcurrent::run(this,&MyClass::slowFunction);
}
void MyClass:slowFunction(){
对于(int i=0;i<100;i++){

qDebug()您需要使用QMutex保护对成员变量的访问

void MyClass 
{
...
private:
QMutex mutex;
}
然后,每当您访问并发服务器使用的变量时,都会使用锁对其进行保护

{
QMutexLocker locker(&mutex);
// access variable
}

修改线程或QConcurrent中的成员变量并没有错,但您需要保护它。

在本例中,如果我使用QFuture,则类实例将在需要时保持活动状态

class MyClass : QObject {
public:
    void LongFunction() {
        for( int count = 0; count < 5; count++ ) {
            sleep( 1 );
            std::cout << "Ping long!" << std::endl;
        }
    }

    void run_c() {
        QFuture<void> future = QtConcurrent::run(this, &MyClass::LongFunction);
    }


};

int main(int argc, char *argv[])
{
    MyClass c;
    c.run_c();
}
类MyClass:QObject{
公众:
空长函数(){
对于(int count=0;count<5;count++){
睡眠(1);

std::cout很可能在线程开始运行之前,
MyClass
的实例被破坏了。你能在调用
startananalysis
的地方发布代码吗?我敢肯定,MyClass的正确实例不会被破坏。问题很可能不在你展示的代码中,这就是为什么我们无法提供帮助,除非你揭示了更多关于你的问题。我没有用你提供的代码示例重现“this”的崩溃。更多的代码会有所帮助,但我个人同意Yuki的观点,你的“this”可能被删除了,而你的慢函数仍然在使用它。事实上,这是我的“slowFunction()中的主要问题我对一个库进行了调用,说它不是线程安全的。因此,在该库中添加适当的互斥锁就成功了。