Потому что вы делаете join только когда сервер заканчивает свою работу, для всех запущенных потоков сразу. Т.е. вы запустили N потоков, из них M свою работу закончили, но ресурсы вы за ними не прибрали.
A thread that has exited but remains unjoined counts against
[_POSIX_THREAD_THREADS_MAX].
© man pthread_join