Как на c# правильно синхронизировать потоки, читающие и пишущие в общую коллекцию?

Есть несколько потоков, которые обходят заранее неизвестную структуру графа. Т.к. получение соседних вершин очень дорогое, они посещаются максимум 1 раз.

Есть две коллекции:

  • Очередь вершин для посещения
  • Очередь уже посещенных вершин

Каждый поток делает следующее:

  • Читает данные из коллекции "для посещения"
  • Получает соседние вершины, и те, которых нет в коллекции "для посещения" и в коллекции посещенных, помещает в коллекцию для посещения

В случае с одним потоком всё понятно, цикл останавливается тогда, когда очередь для посещения пуста.

Если же потоков несколько, может возникнуть ситуация, когда очередь вершин для посещения пуста, но в неё будут добавлены соседи находящихся сейчас в обработке вершин.

Решение вижу таким:

  • Если очередь пуста, переводим поток в состояние ожидания новых вершин
  • Если все другие потоки тоже находятся в состоянии ожидания, выходим из цикла

Вопрос в том, что я не знаю, как реализовать подобное состояние и его ожидание определенного состояния других потоков (выделено жирным).

Чтение про producer-consumer не очень помогло, т.к. тут несколько иной вопрос.


Ответы (0 шт):