Какие уроки вы извлекли из проекта, который почти / фактически провалился из-за плохой многопоточности?
Иногда структура навязывает определенную модель потоков, которая усложняет процесс на порядок.
Что касается меня, мне еще предстоит оправиться от последнего сбоя, и я чувствую, что для меня лучше не работать над чем-либо, что связано с многопоточностью в этой среде.
Я обнаружил, что хорошо справляюсь с проблемами многопоточности, которые имеют простое форк / соединение и где данные перемещаются только в одном направлении (тогда как сигналы могут двигаться в круговом направлении).
Я не могу обработать графический интерфейс, в котором некоторую работу можно выполнять только в строго сериализованном потоке («основной поток»), а другую работу можно выполнять только в любом потоке, кроме основного потока («рабочие потоки»), и где данные и сообщения должны перемещаться во всех направлениях между N компонентами (полностью связанный график).
В то время, когда я оставил этот проект для другого, повсюду были проблемы с тупиком. Я слышал, что через 2-3 месяца нескольким другим разработчикам удалось устранить все проблемы взаимоблокировки до такой степени, что они могут быть отправлены клиентам. Мне так и не удалось обнаружить ту недостающую часть знаний, которой мне не хватает.
Кое-что о проекте: число идентификаторов сообщений (целочисленные значения, которые описывают значение события, которое может быть отправлено в очередь сообщений другого объекта, независимо от потоков), исчисляется несколькими тысячами. Уникальные строки (пользовательские сообщения) также встречаются около тысячи.
добавленной
Лучшая аналогия, которую я получил от другой команды (не связанной с моими прошлыми или настоящими проектами), состояла в том, чтобы «поместить данные в базу данных». («База данных» относится к централизации и элементарным обновлениям.) В графическом интерфейсе пользователя, который фрагментирован на несколько представлений, выполняющихся в одном и том же «главном потоке», и вся тяжелая работа без графического интерфейса выполняется в отдельных рабочих потоках, данные приложения должны храниться в одном месте, которое действует как база данных, и позволяет «базе данных» обрабатывать все «атомарные обновления», связанные с нетривиальными зависимостями данных. Все остальные части GUI просто обрабатывают рисование экрана и ничего больше. Части пользовательского интерфейса могут кешировать содержимое, и пользователь не заметит, если он устарел на долю секунды, если он спроектирован правильно. Эта «база данных» также известна как «документ» в архитектуре Document-View. К сожалению - нет, мое приложение фактически хранит все данные в представлениях. Я не знаю, почему это так.
Другие участники:
(Участникам не нужно использовать реальные / личные примеры. Уроки из отдельных примеров, если вы считаете, что они заслуживают доверия, также приветствуются.)