c ++ boost asio sync write в обработчике async_receive - PullRequest
0 голосов
/ 07 декабря 2011

Первоначально я спрашивал - возможно ли выполнить boost :: asio :: write () в обработчике сокета async_receive ()?Это происходит на одном io_service, в одном потоке.У меня есть некоторый код, написанный для этого, и Я думал , что он зависал при вызове write ().Но я забыл нажать кнопку воспроизведения в моей игре (это для маленькой клиент-серверной игры)!Но это не совсем соответствует моему пониманию boost asio, поэтому я оставлю вопрос, но спрашиваю, почему это работает?

Сначала я подумал, что это невозможно, потому чтопоток не может обработать вызов write (), поскольку io_service уже занят этим заданием asynch_receive ().Я подумал, что мне понадобится другой поток, выполняющий io_service.run (), чтобы он мог обрабатывать write ().По-видимому, это не так.

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

1 Ответ

0 голосов
/ 07 декабря 2011

Подумайте о базовых операциях ввода-вывода, которые вызываются Boost с помощью API для конкретной ОС: сокеты, последовательная связь или любые другие. Нет ничего, что мешало бы нам вызывать send или WriteFile API из того же потока, куда поступают данные. Единственный побочный эффект, о котором я могу думать, - это когда операция отправки долго зависает, блокируя поток получателя. Но это может произойти, только если весь канал связи перестал работать, так что это не имеет значения.

...