Я пытаюсь реализовать многопоточную, рекурсивную логику поиска файлов в Visual C ++.Логика следующая: потоки 1,2 начнутся с места в каталоге и сопоставят файлы, присутствующие в каталоге, с критериями поиска.Если они найдут дочерний каталог, они добавят его в рабочую очередь.Как только поток завершает работу с файлами в каталоге, он получает другой путь к каталогу из рабочей очереди.Рабочая очередь представляет собой класс стека STL, защищенный CriticalSections для вызовов push (), pop (), top ().
Если стек пуст в любой точке, потоки будут ждать минутное количество времениперед повторной попыткойТакже, когда все потоки находятся в состоянии ожидания, поиск помечается как завершенный.
Эта логика работает без каких-либо проблем, но я чувствую, что не использую весь потенциал использования потоков, потому что это не сильноувеличение производительности по сравнению с использованием одного потока.Я чувствую, что рабочий стек - это горлышко бутылки, но не могу понять, как избавиться от запирающей части.Я попробовал другой вариант, где каждый поток будет иметь свой собственный стек и будет добавлять рабочий элемент в глобальный стек только тогда, когда локальный размер стека пересекает фиксированное количество рабочих элементов.Если локальный стек пуст, потоки попытаются извлечь из глобальной очереди.Я не нашел заметной разницы даже с этим вариантом.Есть ли у кого-нибудь предложения по улучшению логики синхронизации.
С уважением,