C ++ обработка событий - PullRequest
       4

C ++ обработка событий

1 голос
/ 19 октября 2010

Я использую превосходный asio для асинхронного сетевого клиента. При обработке read (async_read) я обеспокоен тем, что метод / функция, обрабатывающая данные, может зависнуть или занять слишком много времени (функция предоставляется пользователем класса).

Каков наилучший способ вызова поставляемой функции и , гарантирующий, что это не займет слишком много времени?

Спасибо за ваше время.

Ответы [ 4 ]

1 голос
/ 23 октября 2010

Дополнительный поток (ы) для обработки обратного вызова - хорошая идея. Как упоминалось выше, обратный вызов помещает сообщение в потокобезопасную очередь, а другой поток, потребляющий / обрабатывающий сообщение, прекрасно работает.

Еще один сценарий с многопоточностью, который может вам помочь, - это просто запустить дополнительные потоки на io_service. Эти дополнительные потоки позволят обрабатывать несколько обработчиков одновременно.

const int max_threads = 5;
boost::asio::io_service ios;
boost::thread_group thread_group;

for (int i = 0 ; i < max_threads; ++i)
  thread_group.create_thread( boost::bind(&boost::asio::io_service::run, boost::ref(ios)) );

Правильное решение действительно зависит от того, что делает приложение. Если это TCP-соединение и сообщения должны обрабатываться в последовательном порядке, рассмотрите возможность использования очереди производителя / потребителя. Если сообщения независимы друг от друга и не требуют, чтобы они обрабатывались по порядку, тогда этот подход также подходит.

Если это соединение UDP, то все ставки в любом случае отключены, потому что порядок принятых сообщений не гарантируется.

1 голос
/ 19 октября 2010

Есть несколько примеров, представленных в документации для буста, которые описывают то, что вы хотите достичь.

http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/examples.html

см. Примеры в разделе «Тайм-ауты».

1 голос
/ 20 октября 2010

Если работа, выполняемая вашим обработчиком, не является очень короткой (маловероятной в реальных приложениях), вы захотите, чтобы очередь производителя / потребителя передавала полученные данные из ваших потоков ввода / вывода в вашрабочий (ы) для дальнейшей обработки, так что вы можете вернуться из вашего обработчика как можно скорее.

Существует учебник для продюсера / потребителя, использующий Boost.Thread здесь - написанный текущим автором библиотеки Boost Threads в качестве бонуса.

1 голос
/ 19 октября 2010

Вы можете написать функцию-обертку, которая запускает данный обработчик в отдельном потоке и выполняет над ним timed_join.Если время ожидания истекло, вы можете сгенерировать исключение или сделать все, что захотите.

...