生产者消费者小白问题!

2023-08-24 16:42:27 +08:00
 sbldehanhan

(ir->not_full).wait(lock);为啥要把这句 baok 包含到 while 循环里?直接等着不满的信号不就好了? while 也是判断不满的呀?

void Producer(resource *ir, int item)
{
	std::unique_lock<std::mutex> lock(ir->mtx);
	while (((ir->write_pos + 1) % bufSize)
		== ir->read_pos) { // item buffer is full, just wait here.
		std::cout << "Producer is waiting for an empty slot...\n";
		(ir->not_full).wait(lock); // 生产者等待"产品库缓冲区不为满"这一条件发生.
	}

	(ir->buf)[ir->write_pos] = item; // 写入产品.
	(ir->write_pos)++; // 写入位置后移.

	if (ir->write_pos == bufSize) // 写入位置若是在队列最后则重新设置为初始位置.
		ir->write_pos = 0;

	(ir->not_empty).notify_all(); // 通知消费者产品库不为空.
}
1567 次点击
所在节点    C++
6 条回复
anjingdexiaocai
2023-08-24 18:20:58 +08:00
搜索一下 竞态条件( Race Condition )
mmdsun
2023-08-24 23:48:09 +08:00
虚假唤醒? Spurious wakeup
dangyuluo
2023-08-25 04:53:00 +08:00
似乎是在处理 spurious wakeup ,不过 condition variable 本身就可以接受 predictor ,不知道这么做的意义是什么。看样子会有多个 Producer
sbldehanhan
2023-08-25 09:30:06 +08:00
@dangyuluo #3 是有多个生产者。是说可能其他生产者可能已经在生产了?
dangyuluo
2023-08-25 12:21:10 +08:00
肯定要考虑竞争的呀,不过这种设计感觉怪怪的
dangyuluo
2023-08-25 12:22:51 +08:00
估计 consumer 消费的时候用的是 ir->not_full.notify_all(),然后多个 producer 为了不超出 buffer 大小,只能用这个方法了。设计有点问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/968018

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX