Задачка на синхронизацию
AA и BB должны синхронизоваться.
Или исключения только для групп методов: "все методы этой группы могут исполняться одновременно, но не больше 1 потока на каждый отдельный метод"?
так и есть.
Наверное самое простое (но не самое элегантное) решение - использовать кучу мониторов - по количеству членов "параллельных" групп.
Для варианта ABCD и одной "параллельной" группы AB - два монитора monA и monB. Метод А ждёт свободного monA, метод B - monB, соответственно. C и D же должны забирать себе оба монитора.
A работает - занят monA. B может начать работать? - Да, monB не занят. C, D может начать работать? - Нет, monA занят. Ещё один A может начать работать? - Нет, monA занят.
Но на первый пункт браво. Очень близко.
Переосмыслил код еще раз. Вообще не будет работать. Даже близко.
C и D же должны забирать себе оба монитора.
Если мониторы захватываются последовательно, то нужно еще и на захват сихронизацию ставить. Если захват одновременный, то во время релиза оценивать счетчики, что захватили, что нет.
Решение с отдельным семафором для каждого члена "параллельной" группы имеет место быть. Оно рабочее, но не масштабируемое (не вполне и не красиво). Мы от него отказались в пользу командного процессора, который вообще не требует объектов синхронизации, так как полностью, из коробки, контролирует время жизни любой из команд и любых комбинаций оных. Всем спасибо за участие.