このブログ投稿 (2010)では、誰かが Boost::strand 機能を使用してプロデューサー/コンシューマーの問題を解決しようとしています。彼は要点を見逃しており、彼のプログラムは一部の生産者と一部の消費者を同時に実行することは決してないと感じていますが、私はそれについて自信を持っているブーストライブラリの専門家ではありません.
- 彼はストランドを 1 つしか持っていません。そのストランドでは、 と の両方
producer()
のconsumer()
呼び出しがいくつかのタイマーによってディスパッチされます。 - 彼には 2 つのスレッドがあり、どちらも呼び出しています
io_service::run()
それでも、「これらのハンドラーのいずれも同時に実行されない」という保証のある 1 つのストランドのみは、生産または一度に生産することも意味しますが、生産者がユニット 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()" は、実際には共有バッファーとやり取りするモニター保護された部分ですか?