c – Qt5 QWaitCondition示例

c – Qt5 QWaitCondition示例,第1张

概述我对自己熟悉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();
总结

以上是内存溢出为你收集整理的c – Qt5 QWaitCondition示例全部内容,希望文章能够帮你解决c – Qt5 QWaitCondition示例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存