2017-06-08 15 views

答えて

0

私はboost :: asio :: io_service :: run_one()で読んでいましたが、関数ブロックが意味することで混乱しています。ブロックされたもの

ブロックされたものは、1つのハンドラを完了するまでブロックします。

ハンドラはどこに定義されていますか?

これはありません。 Logically it's described in the documentation。ハンドラは、サービスで保留中のアクションです。だから、あなたがしなければ:

void foo() { /*.... */ } 
void bar() { /*.... */ } 

io_service svc; 
svc.post(foo); 
svc.post(bar); 

fooが完了するまで、あなたは

svc.run_one(); 

ブロックを呼び出し初めて。 2回目

svc.run_one(); 

は、barまでブロックされます。その後、run_one()をブロックし、ちょうどあなたがサービスの周りに滞在させる場合は0を返しません、例えば:

io_service::work keep_around(svc); 
svc.run_one(); 

他のいくつかのアクションが掲載されるまでブロックされます。

+0

最後のユースケースについて詳しく説明できますか? –

+0

リンクされたドキュメントは、[仕事](http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/reference/io_service__work.html)も参照してください。短い要約は、すべての作業が完了したら 'run *()'と 'poll *()'が常に戻るということです。 「仕事」はそれを防ぐ「人工的」作品です。なぜなら、run_one()が特定のタスクを実行する時間だけでなく、無期限にブロックできることを示しているからです。 – sehe

+0

申し訳ありませんが、リンクされたドキュメントについてより明確な説明がありますか?私はそれを完全に理解していないかもしれませんし、私のrun_one()の実装は無期限にブロックされたようです。 –

関連する問題