С#. Как синхронизировать две группы потоков, каждая из которых должна ждать окончание выполнения другой
Есть условно две группы потоков:
- Группа потоков, не осуществляющих доспуп в общую память с возможностью работать в многопоточном режиме.
- Группа потоков, осуществляющих доспуп в общую память, которая нуждается в синхронизации (выполняются строго по одному). Специфика тут такая, что если возникает хотя бы один поток из группы 2, он должен подождать окончание всех потоков группы 1 (если такие есть), и только после этого стартовать. Также и в обратную сторону. Если возникает поток из группы 1, прежде чем стартовать, он должен подождать завершения всех потоков группы 2.
То-есть, две группы потоков не могут выполнятся одновременно. Для определения в какую группу попадает какой поток, у каждого из них есть булевый идентификатор. Важно, что 1-ая группа потоков, если она стартовала, должна всегда выполнятся в многопоточном режиме! А 2-ая - всегда в однопоточном.
Проблема в том, что Parallel.For, создающий эти группы, сам может быть вызван из разных потоков, поэтому невозможно выполнить разделение на две группы до выполнения Parallel.For, чтобы выполныть их последовтельно.
Насколько я вижу, ни один из объектов синхронизации не позворляет просто подождать окончание выполнения потока, без последующего лока этого объекта тем потоком, который ждал. Можно конечно в цикле проверять Monitor.IsEntered (locker), и потом ждать, но это не рекомендуется в самом мануале к Monitor.