Пока у вас никогда не будет больше потоков, использующих процессорное время, чем у ядер, у вас будет оптимальная производительность, но тогда, как только вам придется ждать ввода / вывода, будут неиспользованные циклы процессора, так что вы можете захотеть Профилируйте ваши приложения и смотрите, сколько времени ожидания он тратит на максимальную загрузку ЦП и какую часть ожидает ОЗУ, жесткий диск, сеть и другие операции ввода-вывода, в общем, если вы ожидаете ввода-вывода, у вас может быть еще 1 поток При условии, что вы в основном связаны с процессором).
Для жесткого и абсолютного предела. Проверьте PTHREAD_THREADS_MAX в limit.h. Это может быть то, что вы ищете. Может быть POSIX_THREAD_MAX в некоторых системах.