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