|
|
1
2
当发布者的发布速度快于消费者的消费速度时,您需要处理这种情况。
当这种情况发生时,消费者会错过
将使用者更改为在唤醒后使用所有可用消息:
这样地:
|
|
|
2
1
您有两个问题:一个是发布者没有义务向读取器屈服,或者暂停足够长的时间让读取器成功地锁定互斥锁,除非您成功地做到了。 第二是你的读者无论如何都是不正确的:
这假设每个推送到队列中的元素有一个“唤醒事件”,因为每个唤醒只消耗一个元素。但那是 不 条件变量如何工作。 完全有可能发生这种情况:
在这种情况下,发布者将添加100个项目,并发出100次信号,但读者将只唤醒99次,因此最多消耗99个项目。 正确的代码应该是这样的:
使用谓词实现了大致相同的功能(为了清晰起见,我只是显式地写出了所有的逻辑)-第二个
此外,不需要在每次迭代时都对互斥锁进行重击——条件变量已经(取消)根据需要将其锁定。 |
|
|
fiedel · 为什么互斥锁可以被两个线程锁定? 2 年前 |
|
|
da cheng · 在c++11中使用条件变量使程序陷入死锁 8 年前 |
|
|
Eunjeong Choi · 为什么此代码返回意外结果?(条件变量) 8 年前 |
|
|
Razonixx · 从线程内增加全局计数器变量,而不必等待每个线程 8 年前 |
|
|
Administrator · c#-等待完成2个线程中的1个 8 年前 |