Boost :: asio параллелизм (?) - PullRequest
1 голос
/ 11 июля 2011

Я компилирую пример boost :: asio: http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/examples.html#boost_asio.examples.http_server_3

Предполагается, что это многопоточная реализация сервера.

Теперь в обработчике async_read я печатаю сообщение и сплю 30 секунд. Я открываю localhost в двух браузерах и вижу, что handle_read вызывается один раз, затем через 30 секунд ничего не происходит и, наконец, handle_read вызывается во второй раз.

io_Service.run вызывается с 5 потоками.

Почему обработчики не вызываются одновременно? например почему он ожидает завершения первого handle_read перед вызовом второго?

1 Ответ

1 голос
/ 11 июля 2011

Помогает опубликовать код.Когда я использую это изменение в примере asio:

void connection::handle_read(const boost::system::error_code& e,
    std::size_t bytes_transferred)
{
  std::cerr << "connection::handle_read()\n";
  boost::this_thread::sleep(boost::posix_time::seconds(10));
  std::cerr << "connection::handle_read() done sleep\n";
  if (!e)
  {

, оно работает как положено, то есть

$ ./test 0.0.0.0 7777 5 .
connection::handle_read()
connection::handle_read()
connection::handle_read() done sleep
connection::handle_read() done sleep

Как вы "спите в течение 30 секунд"?Возможно, функция сна, которую вы использовали, приостанавливает все потоки в процессе?

...