As recommended by Tobu, epoll is the best choice and it is better than the choice. However, most of these polling functions will indicate that there is an event (data available) if someone is not reading. If possible, use the following model: Use epoll / select to ensure that incoming data activates the workflow. Let the workflow decide what to do with the data (one package, two or more) before doing the work.
OR: One Reader thread-N Workflows: will use epoll to wait and read all incoming data and send it to the queue of the corresponding workflows. Once the package packet reaches the threshold, wake up the Worker thread (using a semaphore).