2010-02-11 11 views
7

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?

Odpowiedz

17

Można użyć wartości eventfd, która jest faktycznie tym samym, co sztuczka samowylepiająca, z wyjątkiem mniejszej liczby deskryptorów plików i mniejszej liczby znaków (na przykład funkcje glibc mają wygodę eventfd_read/write).

+0

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? –

1

pan wymienił zdarzenia, które mogą obudzić epoll, tak naprawdę staje się pytanie: „W jaki sposób mogę zmniejszyć boilerplate dla self-trick rury”

Odpowiedź na to pytanie zależy od tego kodu, języka i co chce zrobić. Zakładam, że masz wątek, który przetwarza I/O i chcesz wykonać inną pracę w tym wątku, podczas gdy nie ma gotowych wejść/wyjść. W kodzie, który zarządza pętlą epoll, może mieć wewnętrzny uchwyt, który jest wystawiony na działanie innych części systemu jako funkcja "wake" lub funkcja "submit work".

Istnieją bibliotek, które to zrobić, na przykład boost.asio dla C++. Jednak nie jest trudno napisać własną, jeśli po prostu celujesz w epoll, a ilość aktualnego kodu na płycie powinna być minimalna, gdy masz klasę/moduł/cokolwiek, co dotyczy pętli epoll.

Powiązane problemy