Как на c# правильно синхронизировать потоки, читающие и пишущие в общую коллекцию?
Есть несколько потоков, которые обходят заранее неизвестную структуру графа. Т.к. получение соседних вершин очень дорогое, они посещаются максимум 1 раз.
Есть две коллекции:
- Очередь вершин для посещения
- Очередь уже посещенных вершин
Каждый поток делает следующее:
- Читает данные из коллекции "для посещения"
- Получает соседние вершины, и те, которых нет в коллекции "для посещения" и в коллекции посещенных, помещает в коллекцию для посещения
В случае с одним потоком всё понятно, цикл останавливается тогда, когда очередь для посещения пуста.
Если же потоков несколько, может возникнуть ситуация, когда очередь вершин для посещения пуста, но в неё будут добавлены соседи находящихся сейчас в обработке вершин.
Решение вижу таким:
- Если очередь пуста, переводим поток в состояние ожидания новых вершин
- Если все другие потоки тоже находятся в состоянии ожидания, выходим из цикла
Вопрос в том, что я не знаю, как реализовать подобное состояние и его ожидание определенного состояния других потоков (выделено жирным).
Чтение про producer-consumer не очень помогло, т.к. тут несколько иной вопрос.