c++ - boost::strand 生产者/消费者有意义吗?

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

this blog post (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() 接受一个 strand-wrapped-"produce"函数作为完成回调和一个类似的 Socket::ready-to-再写一次,这将解释他的提议只要“生产者()”和“消费者()”实际上是与共享缓冲区接口(interface)的监视器保护部分就有意义?

最佳答案

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

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

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

参见 this实现的答案。

关于c++ - boost::strand 生产者/消费者有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19094920/

相关文章:

c++ - 编译 C++ 项目 VS2012 时出现错误 C4335

c++ - 测试类

c++ - 运算符重载 (--) 将变量设置为 0

c++ - 使用 scanf 读取 long int

java - 在线程之间传递对象

c++ - Boost::ASIO 和 std::packaged_task

c - pthread 参数地址与以前不同

c# - 试图把我的头缠绕在线程上

c++ - Boost::Asio::Ip::Tcp::Iostream 问题

c++ - 需要解释以理解 asio REFERENCE_COUNTED 示例