如何开发线程安全的生产者/消费者模式?
在我的例子中,生产者在一个线程中运行,而消费者在另一个线程中运行。
std::deque用于此目的安全吗?
我可以在一个线程中push_back到一个双端队列的后面,而在另一个线程中执行push_front吗?
编辑1
在我的例子中,我知道std::deque中的最大项目数(例如10)。有没有办法预先为项目预留足够的空间,以便在处理过程中,不需要更改队列内存的大小,从而确保当我向后添加推送数据时,前面的数据不会发生变化?
发布于 2015-06-11 16:29:11
我想你是指push_back()和pop_front()吧。
std::deque本身不是线程安全的。您将需要使用std::mutex序列化访问,这样消费者就不会在生产者尝试推送时尝试弹出。
您还应该考虑如何处理以下问题:
如果它进入等待状态,那么您将需要一个std::condition_variable,以便在添加了该双队列时由生产者通知。您可能还需要处理程序终止,在此过程中,消费者正在等待双队列,而程序被终止。除非你正确地安排了事情,否则它可能会“永远等待”。
10个项目是“无关紧要的”,所以我不会为预留空间而烦恼。std::deque会自动地增长和缩小,所以在构建一个可以工作的应用程序之前,请不要费心进行细粒度调整。
过早优化是万恶之源。
注意:不清楚你是如何限制队列大小的,但是如果生产者填满了队列,然后等待它清空,你将需要更多的等待和条件,以另一种方式来协调。
https://stackoverflow.com/questions/30775277
复制相似问题