加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Qt5 QWaitCondition示例

发布时间:2020-12-16 03:41:47 所属栏目:百科 来源:网络整理
导读:我对自己熟悉QT5并发库.我在看QWaitCondition示例( http://qt-project.org/doc/qt-5.0/qtcore/qwaitcondition.html#details). 这里,一个线程(线程B)读取用户输入,所有其他线程(线程A)处理此输入. 线程A: forever { mutex.lock(); keyPressed.wait(mutex); +
我对自己熟悉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变量和扩展互斥同步的原因是为了防止符号丢失.
问题是,我认为符号可能会丢失:
想象一下以下场景:

>线程A处理符号,并减少反对(–count);
互斥体被释放;然后线程A停止
>线程B从睡眠状态返回,获取互斥锁,看到,计数==
0,并调用keyPressed.wakeAll(),然后解锁互斥锁.
然而,wakeAll()调用无处可去,因为线程A是
不等
>线程A再次启动,对互斥体进行aquaires并进入等待().
由于wakeAll()已被调用,因此符号丢失.

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

解决方法

你是对的

为了解决这个问题,应该使用已经获得的互斥锁输入循环:

mutex.lock();
forever {

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

    do_something();

    mutex.lock();
    --count;

}
mutex.unlock();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读