Прежде всего, не рекомендуется создавать неограниченное количество потоков (например, поток на узел). Обычно вы хотите иметь максимум в 1,5-3 раза больше потоков, чем у ядер вашего процессора (например, 6-12 потоков для четырехъядерного процессора).
Я бы порекомендовал использовать thread-pool и задачи . В таком случае вашу проблему можно перефразировать как размер ваших задач.
Оба упомянутых вами метода действительны, и у каждого есть свои плюсы и минусы.
Одна задача на каждый ввод данных должна быть простой в реализации, так как алгоритм обработки графа останется однопоточным. Затраты на переключение контекста, синхронизацию и передачу данных между потоками практически отсутствуют.
Когда на узле есть два исходящих ребра, эта единственная задача должна следовать за ними обоими. Это стандартная часть всех алгоритмов обхода графа, например, поиск в глубину или поиск в ширину .
Одна задача на узел графа может улучшить задержку в случае, если ваши графы имеют много "ветвей", которые могут обрабатываться параллельно. Однако этот подход требует более сложного проектирования обработки графов, и это приведет к увеличению накладных расходов на синхронизацию потоков. На самом деле стоимость многопоточности может быть выше, чем выгоды от параллельной обработки графика.
Когда на узле есть два исходящих ребра, вы можете создать две новые задачи и очереди, затем в пуле потоков. (Или поставьте одну задачу в очередь и продолжите обработку другой.)
Более сложная проблема - когда в узле есть два входящих ребра. При обработке задачи узлу придется ждать, пока станут доступны данные для обоих ребер.
Вывод: Я бы лично начал с первого варианта (одно задание на ввод данных) и посмотрел, как далеко вы сможете с ним справиться.