boost :: asio предоставляет пример того, как использовать библиотеку для реализации асинхронных тайм-аутов;клиент отправляет серверу периодические сообщения сердцебиения на сервер, который возвращает сердцебиение обратно клиенту.отказ ответить в течение N секунд вызывает разъединение.см. boost_asio / example / timeouts / server.cpp Шаблон, приведенный в этих примерах, будет хорошей отправной точкой для части проекта, над которой я буду работать в ближайшее время, но для одной проблемы: в дополнение к сердцебиениям, и клиент, и сервер должныотправлять сообщения друг другу.Пример тайм-аутов помещает эхо-сообщения пульса в очередь, и последующий тайм-аут приводит к тому, что асинхронный обработчик тайм-аута фактически записывает данные в сокет.
Ввод данных для сокета для записи невозможен в потоке, выполняющем io_service, поскольку он заблокирован в run ().run_once () не помогает, вы по-прежнему блокируете до тех пор, пока не будет запущен обработчик, и вводите сложность управления работой для io_service.В asio асинхронные обработчики - записи в сокет, являющиеся одним из них - вызываются в потоке, выполняющем io_service.
Поэтому, чтобы вводить сообщения случайным образом, отправляемые данные помещаются в очередь из потока, отличного от потока io_service, что подразумевает защиту очереди и таймера уведомлений с помощью мьютекса.Затем на сообщение приходится два мьютекса, один для отправки данных в очередь, а другой для обработчика, который удаляет данные из очереди для записи в сокет.
Это на самом деле более общий вопрос, чем просто тайм-ауты asio: isсуществует ли ситуация, когда поток io_service блокируется в run (), по которому данные могут асинхронно записываться в сокет, не принимая два мьютекса на сообщение?