在这篇博文 (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()" 实际上是与共享缓冲区接口的受监视器保护的部分?