Проблема в следующем:
...
rc = recvfrom(...); // Блокирует тред
...Я знаю решения проблемы, но вот как в тредах их применять...
1) alarm
Просто делаем alarm(TIMEOUT) и ловим errno==EINTR.
Это работает хорошо в однопоточных программах, но возникает вопрос -
какой тред получит SIGALARM? Да и как вообще обрабатывать сигналы
в тредах, ведь action'ы вроде задаются на процесс, а на тред
только маски.
2) MSG_DONTWAIT
Задать неблокирующее чтение и ловить EAGAIN.
При этом вызывать нужно в цикле и делать какую-то (хоть даже малую)
задержку.
Возникает вопрос - как делать задержку?
Ведь select(1,0,0,0,&timeout) в тредах вроде тоже вызывать нельзя
(not thread safe).
А задержка с дискретом в секунду меня не устроит.
3) select
Not thread safe.
4) SO_SNDTIMEO / SO_RCVTIMEO
После вот таких описаний желание использовать пропадает:
SO_{SND,RCV}TIMEO are probably the most widely
unimplemented, or strangely/incompatibly implemented, of all
common sockopts in existence... Basically, in short, NEVER
try to use them for anything... ;-)
Короче - как _грамотно_ решается подобная задача?
Спасибо!