Qt5 QWaitCondition示例

时间:2013-11-12 15:36:43

标签: c++ multithreading qt

我熟悉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();
}

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

  1. 线程A处理符号,减少反对(--count); 互斥体被释放;然后线程A停止

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

  3. 线程A再次启动,对互斥体进行aquaires并进入wait()。         由于wakeAll()已被调用,因此符号丢失。
  4. 我是对的,还是我错过了什么?如果我是对的,如何纠正这个例子以真正阻止它跳过符号?

1 个答案:

答案 0 :(得分:10)

你是对的

要解决此问题,应使用已获取的互斥锁输入循环:

mutex.lock();
forever {

    keyPressed.wait(&mutex);
    ++count;
    mutex.unlock();

    do_something();

    mutex.lock();
    --count;

}
mutex.unlock();