Почему для обновления пользовательского интерфейса в качестве основного потока используется однопоточная модель?

В документе Qt говорится:

Как уже упоминалось, каждая программа имеет один поток при запуске. Эта нить называется "основной нитью" (также известной как "поток GUI" в Qt). В этом потоке должен работать GUI GUI.

В документе Android говорится:

Подобно действиям и другим компонентам, службы работают в основном поток процесса приложения

И iOS,

Настоятельно рекомендуется не обновлять элементы управления пользовательским интерфейсом и т.д. из фоновый поток (например, таймер, comms и т.д.). Это может быть причиной которые иногда очень трудно идентифицировать. Вместо этого используйте эти для принудительного выполнения кода в потоке пользовательского интерфейса (который всегда является "основной" поток).

Почему они используют однопоточную модель для обновления интерфейса?

Ответ 1

Короткий ответ: это единственный разумный способ убедиться, что дисплей не поврежден.

Долгий ответ заключается в том, что разрешение нескольких потоков на обновление пользовательского интерфейса приводит к взаимоблокировкам, условиям гонки и всем неприятностям. Это был болезненный урок, который преподавал Java AWT (среди других UI-систем), который позволяет нескольким потокам касаться пользовательского интерфейса. См., Например, этот пост в блоге.