1

私の質問は、ブースト asio の io_service についてです。そのメソッドで呼び出すと:

int main()
{
  try
  {
    boost::asio::io_service io_service;
    Server server(io_service);
    std::vector<boost::shared_ptr<boost::thread> > threads;
    for (std::size_t i = 0; i < 16; ++i)
    {
        boost::shared_ptr<boost::thread> thread(new boost::thread(boost::bind(&boost::asio::io_service::run, &io_service)));
        threads.push_back(thread);
    }
    for (std::size_t i = 0; i < threads.size(); ++i)
    threads[i]->join();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

リクエストのスレッドを動的に共有しますか、それとも接続グループにスレッドを 1 つだけ提供しますか? ありがとう。

4

1 に答える 1

2

asio::io_service共有イベント キューがあります。これらのイベントは、現在 io_service::run() を呼び出しているスレッドによって処理されます。そうです、ハンドラーが異なるスレッドから呼び出される可能性があります。

サーバーで16個のスレッドを実行することはお勧めしません。これにより速度が低下します(コンテキストの切り替えとboost::asioのボトルネックのため)。本当に多くのスレッドが必要な場合は、「スレッドごとの io_service」イディオムを使用することをお勧めします。

于 2013-11-14T13:11:38.533 に答える