boost :: strand producer / consumer有意义吗?

时间:2013-09-30 13:00:04

标签: c++ multithreading boost-asio producer-consumer

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()”实际上是与共享缓冲区接口的受监视保护的部分,提案就有意义吗?

1 个答案:

答案 0 :(得分:2)

示例代码倾向于更多地关注将strand演示为同步机制,而不是为producer-consumer problem提供解决方案。

对于使用strand解决生产者 - 消费者问题的动机案例,请考虑使用TCP的基于GUI的聊天客户端。 GUI可以生成多条消息,尝试在将前一条消息写入连接之前发送消息。同时,应用程序需要在保留消息的同时使用消息并将每条消息写入TCP连接,从而不会产生交错数据。组合操作(例如async_write)要求流在组合操作完成之前不执行任何其他写操作。为了解释这些行为:

  • 队列可以缓冲聊天消息。
  • GUI可以将操作发布到strand,该操作将:
    • 将聊天消息添加到队列中。
    • 有条件地启动消费者。
  • 使用者是一个异步调用链,它从队列中读取并写入strand内的套接字。

请参阅this答案了解实施情况。