线程什么时候退出?

时间:2010-12-15 04:36:46

标签: c++ multithreading qt thread-safety

我在Qt中的代码是这样的:

void doSomeStuff()
{
    ...
    if(blah blah)
        someObj.start();
    ...
}

然后someObj.run()

void someObj::run()
{
    blah blah blah, do some stuff
    doSomeStuff()
}

打算是针对在someObj.start()创建的新线程结束,然后主线程中的函数doSomeStuff一旦停止就会再次被调用。但是我的程序随机崩溃,当我再次密切关注代码时,我意识到真正的情况可能是新线程只是调用函数而不会消失,从而不断产生新的线程。我的怀疑是否正确?如果是这样,我应该如何解决这个问题呢?

2 个答案:

答案 0 :(得分:3)

当线程被执行时,当前调用了doSomeStuff(),因为线程仍将处于活动状态,否则只有当doSomeStuff完成后才会被调用^^然后你的线程将退出

通过浏览QT文档(我不是Qt专家),我找到了

http://doc.qt.io/qt-5/qthread.html

  

bool isFinished()const

你可以说从那里回电

答案 1 :(得分:1)

这似乎有点令人困惑。你说你的主线程调用doSomeStuff()来不时地启动一个线程,但你也在线程运行函数中调用它。我只是假设有两种情况。我认为最可能的情况是你希望每次在主线程中调用doSomeStuff时线程只运行一次,如果是这样的话:

void doSomeStuff()
{
    ...
    if(blah blah)
    {
        if(someObj.isRunning())
            someObj.wait();
        someObj.start();
    }
    ...
}

void someObj::run()
{
    blah blah blah, do some stuff
}

如果您确实希望线程主体反复循环,只需使用while循环而不是尝试再次调用它。在这种情况下,你可能希望每次调用doSomeStuff时,线程肯定会为确定运行,所以你需要更聪明一点:

bool someObjRun = false;
QMutex someObjRunLock;

void doSomeStuff()
{
    ...
    if(blah blah)
    {
        someObjRunLock.lock();
        someObjRun = true;

        if (!someObj.isRunning() )
            someObj.start();

        someObjRunLock.unlock();
    }
    ...
}

void someObj::run()
{
    someObjRunLock.lock()
    while( someObjRun )
    {
        someObjRunLock.unlock();

        blah blah blah, do some stuff

        someObjRunLock.lock()
        if(should quit...)
        {
            someObjRun = false;
        }

    }
    someObjRunLock.unlock()
}