web-dev-qa-db-ja.com

asio io_serviceディスパッチ対ポストのブースト

誰かがio_service dispatchpost の違いを教えてもらえますか?私の問題に何が適しているかははっきりしませんでした。

別のハンドラー内でハンドラーを呼び出す必要がありますが、invokerを使用する方法がわかりません。

32
coelhudo

まあ、それは呼び出しのコンテキストに依存します、つまり、それはio_service内から実行されるか、またはなしで実行されます:

  • postは、関数を直接呼び出すことはありませんが、呼び出しを延期します。
  • dispatchは、dispatch-callerがio_service自体から呼び出された場合はすぐに呼び出しますが、それ以外の場合はキューに入れます。

したがって、post/dispatchを呼び出す関数が呼び出されたかどうか、および指定されたハンドラーをすぐに呼び出すことができるかどうかに依存します。

これが意味すること:

... dispatchは最終的に再度コードを呼び出す可能性があります(当然、これはアプリと呼び出しのチェーン方法に依存します)が、一般に次のことを行う必要がありますdispatchを使用します。

dispatchは、可能であれば呼び出しのキューイングを回避するため、より高速です。これには注意事項がいくつかあるので、postを時々、または常に(安全にプレイしたい場合や、余裕がある場合)使用する必要があるかもしれません。

更新

@gimpfの削除された回答から一部を組み込むために、古いブーストバージョンにはディスパッチの実装がありました(私のコメント):

template <typename Handler>
void dispatch(Handler handler)
{
  if (call_stack<win_iocp_io_service>::contains(this)) // called from within io_service?
    boost_asio_handler_invoke_helpers::invoke(handler, &handler); // invoke rightaway
  else
    post(handler); // queue
}
35
Macke

このブログエントリを参照してください:
投稿または発送しますか?-このスレッド

アプリケーションを実行すると、投稿とディスパッチの違いがわかります。実行できるので、dispatch()はfB()を直接実行するので、現在のスレッドで同期的に実行されることがわかります。一方、post()はio_serviceに、別のスレッドで非同期にジョブを実行するように要求し、すぐに制御を呼び出し元に返します。

10
Akira Takahashi