0

我有一个 GUI 线程,我在其中调用write(QString text)另一个MyQThread.
MyQthread包含QMutex mutexQList<QString> list。以下是 的write()run()方法MyQThread

void MyQThread::write(QString text)
{
     mutex.lock();
     list.append(text); //Point C
     mutex.unlock();
     start(); //Point D
}  

void MyQThread::run()
{
     mutex.lock();

     while(!list.isEmpty())
     {
         QString text = list.takeFirst();
         mutex.unlock();
         ...//do something
         mutex.lock(); //Point A
     }

     mutex.unlock(); //Point B
}  

例如,我们在“A 点”。在此之后,我们正在检查列表,它是空的,所以我们要去“点 B”。此时write()调用,互斥锁仍处于锁定状态,因此 GUI 线程在“点 C”之前等待。
现在我们在“点 B”,在这个 GUI 线程被解锁并调用 start()(“点 D”)之后。
有没有可能,在'点 D' MyQThread 仍在运行?
在这种情况下,调用start()什么都不做。并且在下一次调用之前list不会处理新添加的项目。 附加信息。就我而言,这里只有一个 MyQThread 实例。run()write()

4

3 回答 3

1

@alexisdm 感谢您的想法。这个解决方案怎么样:

class MyQThread:
    public: QThread
{
    ...
    QList<QString> list;
    QMutex mutex;
    QWaitCondition listNotEmpty;
}

void MyQThread::write(QString text)
{
     QMutexLocker locker(&mutex);
     list.append(text);
     listNotEmpty.wakeAll();
}  

void MyQThread::run()
{
     forever
     {
         mutex.lock();
         if(list.isEmpty())
             listNotEmpty.wait(&mutex);

         if(list.isEmpty())
         {
             mutex.unlock();
             continue;
         }
         QString text = list.takeFirst();
         mutex.unlock();
         ...//do something
     }
}  

wait()那么-的第二个参数呢unsigned long time = ULONG_MAX
似乎在我的情况下它不会出错,当write()方法长时间没有被调用并且wait()falserun()after中返回时ULONG_MAX。在这种情况下,我只需要再次等待......

并在文档中写道:

互斥锁将返回到相同的锁定状态。

这是否意味着,wait()即使互斥锁之前未锁定wait()wait()返回false,互斥锁也将始终被锁定?

于 2013-08-19T06:38:46.287 回答
1

是的。尽管出现竞争条件的可能性很低,但我相信 QThread 仍有机会发送信号等。在你打电话之前使用QThread::waitstart()来确定。

编辑:同意需要考虑QMutexLocker。这段代码会很快变得非常复杂,你不能确定你会记得在每个退出点解锁。

Edit2:也许QReadWriteLock在您的情况下可能更有趣?

于 2013-08-16T15:24:56.513 回答
0

QThread 有方法“isRunning”和“isFinished”。所以你可以查询线程状态。当然,您的线程仍可能在“D 点”运行。

但你真的应该在这里停下来读一读。 https://www.qt.io/blog/2010/06/17/youre-doing-it-wronghttp://woboq.com/blog/qthread-you-were-not-doing-so-wrong。 html

最肯定的是关于 QMutexLocker 的 Qt 文档。

于 2013-08-16T15:22:40.747 回答