1

这篇博文 (2010)中,有人试图使用 Boost::strand 工具来解决生产者/消费者问题。我感觉他没有抓住重点,他的程序从来没有同时运行一些生产者和一些消费者,但我不是那种对 boost 库有信心的专家。

  • 他只有一条线,其中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()接受一个链式包装的“生产”函数作为完成回调和一个类似的 Socket::ready-to-write-again,这将解释他的提议只要“生产者”就有意义()" 和 "consumer()" 实际上是与共享缓冲区接口的受监视器保护的部分?

4

1 回答 1

2

示例代码往往更侧重于演示strand同步机制,而不是为生产者-消费者问题提供解决方案。

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

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

有关实现,请参见此答案。

于 2013-09-30T17:26:04.680 回答