Я пишу программу, которая нуждается в рекурсивном поиске по структуре папок и хотела бы сделать это параллельно с несколькими потоками.
Я уже написал довольно тривиальный синхронный метод - сначала добавляем корневой каталог в очередь, затем удаляем каталог из очереди, ставим в очередь его подкаталоги и т. Д., Пока очередь не станет пустой. Я буду использовать ConcurrentQueue<T>
для своей очереди, но уже понял, что мои циклы преждевременно остановятся. Первый поток удалит из корневого каталога очередь, и каждый другой поток сразу же увидит, что очередь пуста, и завершится, оставив первый поток единственным работающим. Я бы хотел, чтобы каждый поток зацикливался до тех пор, пока очередь не станет пустой, а затем дождался, пока другой поток поставил в очередь еще несколько каталогов, и продолжил. Мне нужна какая-то контрольная точка в моем цикле, чтобы ни один из потоков не завершился до тех пор, пока каждый поток не достигнет конца цикла, но я не уверен, что лучший способ сделать это без блокировки, когда на самом деле больше нет каталогов для процесс.