Я бы ждал рабочих нитей в пуле нитей.
Затем мастер ждет по выбору (как для чтения, так и для записи).
Как данные приходят мастер добавляет работы в пул потоков. Как каждая работа добавляется поток просыпается выполняет работу и возвращается в пул. Таким образом, вы не блокировать поток ждет на определенных портах с recv() и фиксированный набор дочерних потоков может обрабатывать весь входящий трафик.
Currentl libs, которые поддерживают эту функциональность в готовых объектах:
Можно попробовать библиотеку ACE, которая поставляется с трубами и очередями сообщений, специально предназначенными для межпоточной связи.
**ACE обозначает адаптивную среду связи*
.