У меня нет большого опыта работы с асинхронными вводами-выводами на сокетах. Недавно мне пришлось внедрить TCP-клиент, который будет подключаться к серверу в отдельном потоке и ждать входных данных, а это неблокируемо, чтобы поток можно было немедленно завершить, просто установив некоторый флаг, который можно было бы использовать из потока управления. Моим решением было установить неблокирование сокета и реализовать цикл, который вызывал recv снова и снова, если errno был E_WOULDBLOCK и вышел из цикла, когда флаг переменной запустил больше не был установлен. Это было так:Неблокирующий выпуск ввода-вывода
while(run) {
if(-1 == recv(...))
{
if(errno == E_WOULDBLOCK)
continue;
else
break;
}
else
{
process_data(...);
}
}
Вопрос в том, насколько хорошо это решение с точки зрения использования ЦП? Будет ли использование select/poll/epoll более эффективным?
И еще один вопрос: есть ли способ сделать заблокирован выбрать, чтения или connnect вызов возврата непосредственно из другого потока?
Какой язык (C, C++) !? – user1766169
Язык: C – olegst
Лучше быть: 'if ((errno == E_WOULDBLOCK) || (errno == EAGAIN))' – alk