Я бы сказал, что прежде всего сам Reporter
должен быть потоком. С точки зрения развязки очень важно изолировать чертежную часть от активного кода (MVC).
Сама структура здесь малопригодна. Когда вы рассуждаете в терминах многопоточности, это не столько структура, сколько поток информации, который вы должны проверить.
Здесь у вас есть 20 активных потоков, которые будут обновлять информацию, и 1 пассивных потоков, которые будут отображать ее.
Проблема здесь заключается в том, что вы рискуете ввести некоторую задержку в выполняемую работу, поскольку поток active не может получить блокировку (используется для отображения). Отчеты (или ведение журнала) никогда не должны блокироваться (или как можно меньше).
Я предлагаю ввести промежуточную структуру (и поток), чтобы отделить графический интерфейс и работу: поток очереди.
- активные темы публикуют события в очереди
- поток очередей обновляет структуру выше
- поток отображения показывает текущее состояние
Вы можете избежать некоторых проблем с синхронизацией, используя ту же идею, которая используется для графики. Используйте 2 буфера: текущий (который отображается потоком отображения) и следующий (обновленный потоком очереди). Когда поток очереди обработал пакет событий (вы сами решаете, что это за пакет), он просит поменять 2 буфера, чтобы в следующий раз отображающий поток отобразил свежую информацию.
Примечание : На личном замечании мне не нравится ваша структура. Рабочий поток должен точно знать, где на экране отображается элемент, который он должен обновить, это явное нарушение инкапсуляции.
Еще раз, посмотрите MVC.
И так как у меня шея глубоко в узорах: посмотри вверх Observer
тоже;)