誰かがio_service dispatch と post の違いを教えてもらえますか?私の問題に何が適しているかははっきりしませんでした。
別のハンドラー内でハンドラーを呼び出す必要がありますが、invokerを使用する方法がわかりません。
まあ、それは呼び出しのコンテキストに依存します、つまり、それは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
}
このブログエントリを参照してください:
投稿または発送しますか?-このスレッド
アプリケーションを実行すると、投稿とディスパッチの違いがわかります。実行できるので、dispatch()はfB()を直接実行するので、現在のスレッドで同期的に実行されることがわかります。一方、post()はio_serviceに、別のスレッドで非同期にジョブを実行するように要求し、すぐに制御を呼び出し元に返します。