можно ждать в epoll или почему таких нигде нету?
Есть несколько потоков, в каждом из них крутится epoll.
Потокам нужно слать друг другу сообщения. Когда потоку приходит сообщение он должен пробуждаться из epoll-а.
Разбудить поток можно разными способами: eventfd, pthread_signal, pipe наконец. Пробуждаться каждые x миллисекунд и проверять очередь так себе вариант.
Как именно будить имхо не очень важно, системный вызов и пробуждение потока это уже относительно долго.
Но допустим используется eventfd, как будто созданный именно для этого.
Для отправки сообщений хочется использовать mpsc queue.
При этом ее нужно как-то скрестить с eventfd, чтобы fast path в eventfd не писал вообще.
То есть хочется хочет делать write в eventfd только когда consumer действительно спит в epoll.
Это можно сделать обернув очередь в семафор внутри которого не futex, а eventfd.
Но нигде не видел реализации такого семафора.
Более того интуитивно кажется что оборачивать очередь в семафор не оптимально, оптимальней встроить eventfd в саму очередь.
Но таких очередей тоже что-то не видно.
А почему не очередь с conditional_variable у каждого потока? Чем вызвана необходимость использовать epoll?
Обсуждают сегодня