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