这里,一个线程(线程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示例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)