Я создаю многопользовательский игровой сервер. В настоящее время сетевая архитектура довольно проста: поток-акцептор представляет собой бесконечный цикл, который просто ожидает в функции accept (). Если он получает соединение, он все настраивает и порождает поток для обработки связи с этим клиентом.
Моя проблема возникает после того, как я получу пакет входа в систему, потому что поток должен просто подождать, пока появятся какие-либо данные для чтения (приходит новый пакет, такой как «атака на это существо»). Я знаю, что флаг O_ASYNC заставит систему запустить SIGIO, но поскольку потоки имеют одинаковый PID в linux, сигнал отлавливается всем процессом.
Существует ли эффективный способ уведомления потока, когда есть данные для чтения, чтобы он знал, когда нужно проанализировать пакет и в конечном итоге вызвать рабочий поток для обработки команды?
Редактировать: забыл упомянуть, что я установил сокет в O_NONBLOCK, поэтому read () не блокирует, потому что поток клиента может быть вызван в любой момент другим потоком.