Проблема в следующем: ... 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... ;-) Короче - как _грамотно_ решается подобная задача? Спасибо!
Ответ на:
комментарий
от klalafuda
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум многопоточный recvfrom (2010)
- Форум Ошибка в многопоточном коде (2019)
- Форум Вопрос про recvfrom (2018)
- Форум Прибейте (2004)
- Форум Учебный фрагмент кода по многопоточному программированию (2017)
- Форум Многопоточность (2016)
- Форум Многопоточность (2013)
- Форум Многопоточность. (2012)
- Форум Многопоточность. (2005)
- Форум Многопоточность (2001)