|
|
1
5
您误用了条件变量。要使用条件变量:
失败。您似乎没有任何共享状态受到mutex的保护,您正在使用condition变量将其更改通知另一个线程。没有这一点,你就无法做出是否等待的正确决定,最终你将等待已经发生的事情。 看到了吗 this answer 更多信息。
你的代码有这个缺陷,因为你的代码决定等待而没有首先检查它等待的事情是否已经发生,违反了规则4。您似乎也违反了规则3,因为我没有看到任何受互斥保护的共享状态。你可能违反了规则5,因为我看不到你的答案
here 要显示所有规则的工作方式:
|
|
|
2
1
大卫的回答很好。我只想澄清几点。看这张照片:
条件变量的主要思想是启用被动同步。我所说的被动是指这样的,即不会在绝望中耗尽CPU
请注意,只有在锁定的互斥锁下才能接触共享数据。 请记住,醒来就像按一次铃。如果要唤醒的线程未处于睡眠状态,它将错过警报。通常这就是你想要的:如果消费者没有睡着,它就不需要你的数据了。如果它需要这些数据,它将在不睡觉的情况下使用这些数据。所以你可以想象制片人是查尔斯卓别林,站在传送带旁边,每次他“生产”一些东西,他都会按门铃。但他不知道,也不在乎是否有人能听到。也许这就是为什么这个函数被称为“notify”,而不是signal,因为通常必须接收信号。通知不起作用。
在图中,生产者在被锁定时通知另一个线程。不需要这样,顺序可以颠倒(先解锁,然后通知其他线程)。 如果你已经走到了这一步,那么你已经准备好接受参考资料中的专业描述了 Condition Variable 请看下面的例子。如何使用lambda检查状况。这是使用条件变量的首选方法:使用它,您不能忘记条件! |
|
|
apetrai · 我应该如何假设算法使用哪种迭代器类别? 3 年前 |
|
|
ridiculous_fish · std::是否保证短路? 3 年前 |
|
|
Fabio · 在c中将指针赋给常数指针++ 3 年前 |
|
|
johnco3 · 初始化固定C数组成员结构 7 年前 |
|
|
mans · 为什么出现此错误:constexpr在此处无效 7 年前 |
|
juztcode · 在C++中尝试捕获-创建了多少个对象 7 年前 |
|
|
Steven Scott · 忽略元素的基于范围的for循环 7 年前 |