В этой записи блога (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()
будет принимать функцию "производства" с обертыванием цепочек в качестве обратного вызова завершения и аналогичный Socket::ready-to-write-again, который объясняет, что его предложение имеет смысл, пока " производитель ()» и «потребитель ()» на самом деле являются частями, защищенными монитором, которые взаимодействуют с общим буфером?
wake_thread_now()
, но он также может запускать асинхронную цепочку, как показано в связанном ответе (цепочкаwrite()
->writeHandler()
). С тем, как работаетstrand
, более вероятно, что графический интерфейс создаст операцию для помещения в очередь и немедленного возврата, а не напрямую поместит в очередь, где она может заблокироваться. 02.10.2013