首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++中的线程安全生产者/消费者模式

c++中的线程安全生产者/消费者模式
EN

Stack Overflow用户
提问于 2015-06-11 16:17:58
回答 3查看 3.2K关注 0票数 0

如何开发线程安全的生产者/消费者模式?

在我的例子中,生产者在一个线程中运行,而消费者在另一个线程中运行。

std::deque用于此目的安全吗?

我可以在一个线程中push_back到一个双端队列的后面,而在另一个线程中执行push_front吗?

编辑1

在我的例子中,我知道std::deque中的最大项目数(例如10)。有没有办法预先为项目预留足够的空间,以便在处理过程中,不需要更改队列内存的大小,从而确保当我向后添加推送数据时,前面的数据不会发生变化?

EN

Stack Overflow用户

发布于 2015-06-11 16:29:11

我想你是指push_back()pop_front()吧。

std::deque本身不是线程安全的。您将需要使用std::mutex序列化访问,这样消费者就不会在生产者尝试推送时尝试弹出。

您还应该考虑如何处理以下问题:

  1. 当消费者寻找下一件商品时,如果队列是空的,它会怎么做?

如果它进入等待状态,那么您将需要一个std::condition_variable,以便在添加了该双队列时由生产者通知。您可能还需要处理程序终止,在此过程中,消费者正在等待双队列,而程序被终止。除非你正确地安排了事情,否则它可能会“永远等待”。

10个项目是“无关紧要的”,所以我不会为预留空间而烦恼。std::deque会自动地增长和缩小,所以在构建一个可以工作的应用程序之前,请不要费心进行细粒度调整。

过早优化是万恶之源。

注意:不清楚你是如何限制队列大小的,但是如果生产者填满了队列,然后等待它清空,你将需要更多的等待和条件,以另一种方式来协调。

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30775277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档