У меня есть многопоточный сервер 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
, без какой-либо помощи оттуда.
Что вы пытаетесь достичь? Почему вам нужно пробуждать N потоков одновременно? –
Я хочу сделать «удалить N потоков от ожидания до того же epoll_fd» и заставить их выйти –