URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5901
[ Назад ]

Исходное сообщение
"Как прибить recvfrom по таймауту в многопоточном коде?"

Отправлено krivenok , 13-Ноя-06 16:52 
Проблема в следующем:
...
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... ;-)

Короче - как _грамотно_ решается подобная задача?

Спасибо!


Содержание

Сообщения в этом обсуждении
"Как прибить recvfrom по таймауту в многопоточном коде?"
Отправлено Dead Mustdie , 14-Ноя-06 14:01 
man poll

+ отдельный поток обнаружения событий
+ пул рабочих потоков
+ очередь от потока обнаружения событий до пула рабочих потоков