Программа не завершает работу, потому что она заблокирована. Ваш код очень близок к правильному, но проблема в том, что «g» - это глобальный указатель на группу задач и вы выполняете рекурсивную декомпозицию задачи, а это не комбинация, которая хорошо сочетается.
Если вы взломали отладчик, я ожидаю, что вы увидите много потоков в task_group :: wait, ожидающих завершения задач.
Задачи не завершаются, потому что вы разделяете свою группу задач между потоками и задачами, и все они фактически ждут друг друга.
Чтобы исправить это, объявите task_group (или structd_task_group) в стеке внутри функции bitonic_merge, это все равно позволит планировать и выполнять задачи во время вызовов, ожидающих, так же, как при использовании parallel_invoke, но потому что task_group isn ' После завершения всех дочерних задач вызов ожидания будет завершен, и во избежание тупика.
Обратите внимание, что я ответил на похожий вопрос с наклоном производительности на форумах msdn для PPL и помните, что синтаксис и семантика task_group, structured_task_group, parallel_invoke и parallel_for / parallel_for_each согласованы между PPL и TBB ; используйте то, что имеет смысл для вас или вашей платформы.