スレッド0で接続を受け入れ、ロードバランシングのためにこのソケットを他のスレッド(1 - 31)にポストしてください。このソケットでの他のすべての操作は同じスレッドになります。コルーチンを使用することによって - スレッド間コンテキスト切り替えを避ける g。コルーチンが常に同じスレッドで動作するようにするにはどうすればよいですか?
私は
io_service
+work
+vector<boost::thread>
を使用することにより、負荷分散のために別のスレッドで非同期コールバックを実行します。しかし同時に、同じソケット内でcoroutineを使用することで、ロードバランシングと高速コンテキスト切り替えなしでこのソケットで他のすべての操作を実行したいと考えています。
私はboost::asio::spawn()
を使用してboost.coroutine1を使用する場合は、コルーチンは異なるスレッドで交互に行うことができますか?
もし可能であれば、コルーチンのコールバックは、たとえio_service
が多くのスレッド(スレッドプール)にバインドされていても、いつも非同期操作が呼び出された同じスレッドで実行されるようにしますか?周知のように
for (size_t i = 0; i < thread_num_executors; ++i)
thr_grp_executors.emplace_back(
boost::bind(&boost::asio::io_service::run, &io_service));
コルーチンの切り替えは非常に高速であり、それはx86_64版でおよそ10-12 NSを取りますhttp://www.boost.org/doc/libs/1_64_0/libs/coroutine/doc/html/coroutine/performance.html
しかし、コルーチンの切り替えは、単一スレッド内で発生した場合、これが唯一の真実です。スレッド切り替えには以上100 nsが必要でした。
次に、コルーチンが常に同じスレッドで動作するようにするにはどうすればよいですか?
前回私はこれを動作させようとしましたが、コルーチンはマルチスレッドで惨めに失敗しました。私は新しいファイバーライブラリを見ていきます:http://www.boost.org/doc/libs/1_64_0/libs/fiber/doc/html/fiber/overview.html – Nim