Obecny scenariusz jest epoll_wait przez kilka fds i kolejka możliwych wiadomości przychodzących, chciałbym, aby pętla poniżej epoll_wait została wykonana na IO zdarzenia lub na nowej wiadomości.
Sposoby wiem:Przerwanie epoll_wait z nie-IO zdarzenia, brak sygnałów
- Użyj
time
ms przerwę i sprawdź kolejkę pierwszą rzeczą w pętli - Skorzystaj z self-pipe trick z kodu kolejki gdy staną się dostępne komunikaty
- przerwać syscall ze standardowym sygnałem
- Zastosowanie epoll_pwait i udoskonalenie poprzedniego punktu
Żaden z punktów zamieszczonych powyżej spełniają mnie enoug h i zastanawiałem się, czy istnieją inne metody, których nie znalazłem.
Powody są następujące:
- Sygnały są czymś, w celu uniknięcia na kodzie wielowątkowym i nie są bardzo wiarygodne
- jeden Timeout usuwa część korzyść epoll tylko przebudzeniu ze zdarzeniami
- Self-pipe sztuczka wygląda najlepsze podejście w tej chwili, ale wciąż za dużo bojlerów
pomysły?
Użyłem eventfd powodzeniem, gdy tylko jeden wątek czeka się epollfd, ale co z wielu wątków czeka na ten sam * * epollfd? czy eventfd jest również użyteczny w takim przypadku? Jeśli tak to jak? –