2015-02-16 2 views
0

У меня есть многопоточный сервер epoll. Я создаю epoll fd, тогда у меня будет X-нить, ожидающая с epoll_wait() любого события из этого SAME epoll fd.многопоточный сервер epoll: просыпаться N нитей, спящих на одном и том же epoll fd

Теперь мой вопрос: как я могу разбудить N нитей, с N> 1 & & N < X?

До сих пор я использовал Linux конкретного eventfd объект, и она работала очень хорошо только с 1 нитью, но теперь с несколькими потоками, ждущих ЖЕ Epoll дескриптора, возникает проблема:

случая 1) LT: Если я добавлю свой eventfd с режимом «уровень срабатывания», ВСЕ потоки просыпаются, когда я пишу в eventfd, это только то, как работает режим запуска уровня: как только состояние fd меняет состояние, давайте проснем все потоки ,

N = X

случай 2) ET: Если я добавить мой eventfd с «краем срабатывает» режим, ТОЛЬКО 1 нить пробудится, когда я пишу в eventfd, и это только как край срабатывает режим работы: нет событий epollfd, пока я не получаю EAGAIN от read(eventfd, ...);.

N = 1

случай 3) Я также попытался с помощью трюка самостоятельно трубы, и писать N раз к трубе просыпался N потоков. Вместо этого он не будет работать: его не надежная, иногда один нить читает 2 «маркер» из трубы, иногда 1 или 3.

N = RANDOM

Во всех случаях я старался, я могу 't получить только N = N, я не могу просыпать только N потоков, но 1 или ВСЕ, или RANDOM. Что мне не хватает? Есть предположения? ПРИМЕЧАНИЕ: Я также попробовал флаг eventfd EFD_SEMAPHORE, без какой-либо помощи оттуда.

+0

Что вы пытаетесь достичь? Почему вам нужно пробуждать N потоков одновременно? –

+0

Я хочу сделать «удалить N потоков от ожидания до того же epoll_fd» и заставить их выйти –

ответ

0

Поскольку вы в основном собираются выйти разбудили темы, как вы разъяснен в комментарии, вот что вы можете сделать:

  • Использование ET, и уверенность в трубу.
  • Напиши номер N в самонаводку (как вам нравится, 2 или 4 байта int)
  • Ожидание потока в epoll_wait() просыпается, считывает число N из трубы, если оно> 1, уменьшает его и записывает в самотрубку и выходы
  • Пробуждение второй нити, она считывает номер из трубы (теперь N-1). Если оно> 1, уменьшает его и записывает в self-pipe и выходит. ...

  • В таком случае, в какой-то момент последняя нить читается 1 из трубы. Этот поток должен выйти, но больше не писать в трубу.

Смежные вопросы