Попробуй вызвать это перед запуском потока:
C++ (Qt)
QThreadPool::globalInstance()->setMaxThreadCount(0);
Проблема в том, что это глобальная настройка и ты не сможешь запускать одновременно несколько потоков, даже если они делают разную работу.
Но как уже правильно сказали, если контейнер невозможно распараллелить, то возвращаемся к QtConcurrent::run(), он запускает только один экземпляр потока на одном ядре. Но и QThread в этом случае тоже хороший вариант, так как предоставляет сразу нужный каркас для работы с сигналами и слотами, в то время как QtConcurrent::run() изначально работает с статическими функциями, но также легко работает с методом любого класса, в том числе на базе QObject'a.