Оптимальным числом будет просто количество процессоров. В оптимальном случае у вас всегда будет один поток, работающий на ЦП (логический или физический), чтобы минимизировать переключение контекста и накладные расходы, связанные с ним.
Правильное ли это число зависит (во многом, как все говорили) от того, что вы делаете. Пул потоков (если я правильно понимаю) старается использовать как можно меньше потоков, но каждый раз запускает еще один поток.
Блокировка никогда не бывает оптимальной, но если вы выполняете какую-либо форму блокировки, то ответ резко изменится.
Самый простой и легкий способ получить хорошее (не обязательно оптимальное) поведение - это использовать пул потоков. По моему мнению, это действительно трудно сделать лучше, чем пул потоков, так что это просто лучшее место для старта и когда-либо думать о чем-то еще, если вы можете продемонстрировать, почему это не достаточно хорошо.