2017-06-12 6 views
0

スレッド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が必要でした。

次に、コルーチンが常に同じスレッドで動作するようにするにはどうすればよいですか?

+0

前回私はこれを動作させようとしましたが、コルーチンはマルチスレッドで惨めに失敗しました。私は新しいファイバーライブラリを見ていきます:http://www.boost.org/doc/libs/1_64_0/libs/fiber/doc/html/fiber/overview.html – Nim

答えて

1

io_serviceが多数のスレッドにバインドされている場合、同じ「物理スレッド」(つまり、論理コア)に作業を表示させる方法はありません。

それ以外の場合は、ストランド上のコロをスポーンして「論理スレッド」を制御できます。

スレッドアフィニティが必要な場合は、io_serviceを1つのスレッドで実行するよりも、スレッドごとにio_serviceを複製するよりも良い方法はないと思います。

これはすべて、より一般化されたエグゼクティブプロポーザルの改善の対象となる可能性があり、Chris Kohlhoffは彼のgithubでそのプレビューレポを持っていると思います。あなたは一見を望むかもしれません。

+0

ありがとう。このhttps://github.com/chriskohlhoff/executors#composition-using-resumable-functionsとこのhttp://chriskohlhoff.github.io/executors/に関することですか? – Alex

+0

それは私が覚えていることです – sehe

関連する問題