在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/