Qt5 QWaitCondition example

Qt5 QWaitCondition example

本文关键字:example QWaitCondition Qt5      更新时间:2023-10-16

我正在熟悉QT5并发库。我正在查看QWaitCondition示例(http://qt-project.org/doc/qt-5.0/qtcore/qwaitcondition.html#details)。
在这里,一个线程(线程 B)读取用户输入,所有其他线程(线程 A)处理此输入。

线程 A:

forever {
    mutex.lock();
    keyPressed.wait(&mutex);
    ++count;
    mutex.unlock();
    do_something();
    mutex.lock();
    --count;
    mutex.unlock();
}

线程 B:

forever {
    getchar();
    mutex.lock();
    // Sleep until there are no busy worker threads
    while (count > 0) {
        mutex.unlock();
        sleep(1);
        mutex.lock();
    }
    keyPressed.wakeAll();
    mutex.unlock();
}

使用计数变量和广泛的互斥体同步的原因是防止符号丢失。
问题是,我认为符号仍有可能丢失:想象一下以下场景:

  1. 线程 A 处理一个符号,并减少计数 (--count);互斥锁被释放;然后线程 A 停止

  2. 线程 B 从睡眠状态返回,获取互斥锁,看到计数 == 0,并调用 keyPressed.wakeAll(),然后解锁互斥锁。 但是,wakeAll() 调用无处可去,因为线程 A 是 不等。

  3. 线程 A 再次启动,将互斥锁变为 wait()。 由于 wakeAll() 已经被调用,符号丢失了。

我是对的,还是我错过了什么?如果我是对的,如何纠正示例以真正防止它跳过符号?

你是对的

要解决此问题,应在已获取互斥锁的情况下进入循环:

mutex.lock();
forever {
    keyPressed.wait(&mutex);
    ++count;
    mutex.unlock();
    do_something();
    mutex.lock();
    --count;
}
mutex.unlock();