kqueue/epoll for Linux/Unix systems or IOCP for Windows.
IOCP will simplify the thread pooling for you by allowing multiple threads to wait on the completion port. With kqueue/epoll, I believe you have to read the data yourself, throw it in a queue, and update a semaphore so one of your threads...