在this blog post (2010)中,有人试图使用Boost :: strand工具解决生产者/消费者问题。我觉得他错过了这一点,并且他的程序永远不会同时运行一些制作人和一些消费者,但我不是那个升级库专家对此有信心。
producer()
和consumer()
来电都是由某些计时器发出的; io_service::run()
然而,只有保证“这些处理程序不会同时执行”的一条链也意味着我们 或一次生成或我说没有什么能阻止生产者生产单位U + t而消费者使用单位U,对吗?
void producer_consumer::producer() {
if ( count_ < num) {
++count_;
intvec_.push_back(count_);
std::cout << count_ < " pushed back into integer vector." << std::endl;
timer1_.async_wait(strand_.wrap(
boost::bind(&producer_consumer::producer, this))); // loops back
timer2_.async_wait(strand_.wrap(
boost::bind(&producer_consumer::consumer, this))); // start consumer
}
}
或者我错过了一个事实,即会有一些File::async_read()
接受一个strand-wrapped-“产生”函数作为完成回调和一个类似的Socket :: ready-to-write-再次解释他的只要“producer()”和“consumer()”实际上是与共享缓冲区接口的受监视保护的部分,提案就有意义吗?
答案 0 :(得分:2)
示例代码倾向于更多地关注将strand
演示为同步机制,而不是为producer-consumer problem提供解决方案。
对于使用strand
解决生产者 - 消费者问题的动机案例,请考虑使用TCP的基于GUI的聊天客户端。 GUI可以生成多条消息,尝试在将前一条消息写入连接之前发送消息。同时,应用程序需要在保留消息的同时使用消息并将每条消息写入TCP连接,从而不会产生交错数据。组合操作(例如async_write
)要求流在组合操作完成之前不执行任何其他写操作。为了解释这些行为:
strand
,该操作将:
strand
内的套接字。请参阅this答案了解实施情况。