Для однопоточных приложений мне нравится использовать диаграммы классов, чтобы получить представление об архитектуре этого приложения. Этот тип диаграммы, однако, не очень помог при попытке понять многопоточные / параллельные приложения, например, потому что разные экземпляры класса «живут» в разных потоках (то есть доступ к экземпляру сохраняется только из одного нить это живет дальше). Следовательно, ассоциации между классами не обязательно означают, что я могу вызывать методы для этих объектов, но вместо этого я должен сделать этот вызов в потоке целевого объекта.
В большей части литературы, которую я выкопал по этой теме, такой как Проектирование параллельных, распределенных приложений и приложений реального времени с использованием UML Хасана Гомаа, было несколько хороших идей, таких как рисование границ потоков в диаграммах объектов, но в целом они казались слишком академичными и многословными для быть действительно полезным.
Я не хочу использовать эти диаграммы в качестве высокоуровневого представления проблемной области, а скорее как подробное описание моих классов / объектов, их взаимодействия и ограничений из-за границ потоков, о которых я упоминал выше.
Поэтому я хотел бы знать:
- Какие типы диаграмм вы считаете наиболее полезными для понимания многопоточных приложений?
- Существуют ли какие-либо расширения классического UML, которые учитывают особенности многопоточных приложений, например, посредством аннотаций, иллюстрирующих, что
- некоторые объекты могут жить в определенном потоке, в то время как другие не имеют привязки к потоку;
- некоторые поля объекта могут быть прочитаны из любого потока, но записаны только из одного потока;
- некоторые методы являются синхронными и возвращают результат, в то время как другие асинхронные, которые помещают запросы в очередь и возвращают результаты, например, с помощью обратного вызова в другом потоке.