Есть ли способ передавать данные между компьютерами без циклов while?C ++ - PullRequest
3 голосов
/ 30 июля 2011

Я изо всех сил пытался найти свой ответ на этот вопрос в Google, поскольку я не знаю точных терминов, которые я ищу для поиска.

Если бы кто-то собирал программу, похожую на MSN Messenger,возможно ли иметь всегда открытые соединения и без цикла while (true)?Если да, может ли кто-нибудь указать мне, как это достигается?

Ответы [ 7 ]

4 голосов
/ 30 июля 2011

Используя boost::asio библиотеку для обработки сокетов, я думаю, что можно определить обратные вызовы при получении данных.

3 голосов
/ 30 июля 2011

Единственное волшебное слово, которое вы ищете - асинхронный ввод / вывод . Это может быть достигнуто либо с помощью асинхронных API (таких функций, как ReadThis (), которые немедленно возвращают и сигнализируют об успехе / неудаче, например, но не ограничиваясь boost :: asio), либо путем отсрочки блокирующих вызовов для разных потоков. Выбор любого метода требует тщательного взвешивания как базовой реализации, так и масштаба ваших операций.

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

Вы можете иметь:

 while(1) {
    sleep(100); // 100 ms
    // check if there is a message
    // process message
    //...
 }

Это нормально, но на серверах, работающих с потоками 10000, есть издержки, так как потоки выходят из спящего режима и проверяют сообщение, вызывая переключение контекста. Вместо этого операционные системы предоставляют такие функции, как select и epoll в Linux, которые позволяют потоку ожидать события.

 while(1) {
    // wait for message
    // process message
    //...
 }

При использовании ожидания поток не "просыпается", пока не получено сообщение.

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

Вы хотите использовать ACE . Он имеет шаблон Reactor, который будет уведомлять вас, когда данные будут доступны для использования.

Схема реактора

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

как насчет связи по протоколу udp?Вам не нужно ждать в цикле while для всех клиентов, просто откройте одно соединение на указанном порту и вызовите метод приема

0 голосов
/ 30 июля 2011

Это отличный вопрос. Как сказал nj, вы хотите использовать асинхронный ввод-вывод. Слишком много программ используют стратегию опроса. Нередко в системе работает 1000 потоков. Если бы все они опрашивали, у вас была бы медленная система. По возможности используйте асинхронный ввод-вывод.

0 голосов
/ 30 июля 2011

Вы можете только спрятать свой цикл while (или какой-то цикл) где-то похороненным в какой-то библиотеке или перезапустить ожидание следующего ввода-вывода при обратном вызове события, но вы не сможете полностью избежать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...