Определенно потоки. Зачем? Будущее многоядерное. Почти любой новый процессор имеет более одного ядра, или если он имеет только один, он может поддерживать гиперпоточность и, таким образом, притворяться, что он имеет более одного. Чтобы эффективно использовать многоядерные процессоры (и Intel планирует довести до 32 ядер в недалеком будущем), вам нужно несколько потоков. Если вы запустите все в одном основном потоке (обычно поток пользовательского интерфейса является основным потоком), у пользователей будут процессоры с 8, 16 и 32-мя днями на 32 дня, и ваше приложение никогда не будет использовать более одного из них, IOW работает намного, намного медленнее чем он мог бы работать.
Фактически, если вы планируете приложение в наши дни, я бы ушел от классического дизайна и подумал о взаимоотношениях между мастерами/подчиненными. Ваш пользовательский интерфейс является мастером, единственной задачей является взаимодействие с пользователем. Это отображает данные пользователю и собирает пользовательский ввод. Всякий раз, когда ваше приложение должно «обрабатывать любые данные» (даже небольшие суммы и гораздо более важные крупные), создавайте «задачу» любого вида, пересылайте эту задачу в фоновый поток и делайте поток выполняющим задачу, обеспечивая обратную связь с Пользовательский интерфейс (например, сколько процентов он завершил или просто, если задача все еще запущена или нет, поэтому пользовательский интерфейс может отображать «индикатор работы в процессе»). Если возможно, разделите задачу на множество небольших самостоятельных подзадач и выполните более одного фонового процесса, подавая одну подзадачу каждому из них. Таким образом, ваше приложение действительно может извлечь выгоду из многоядерных процессоров и быстрее, чем больше процессоров ядра.
Фактически компании, такие как Apple и Microsoft, уже планируют, как сделать их все еще самые однопоточные пользовательские интерфейсы сами по себе многопоточными. Даже с помощью вышеприведенного подхода вы можете однажды определить ситуацию, когда пользовательский интерфейс является узким местом. Фоновые процессы могут обрабатывать данные намного быстрее, чем пользовательский интерфейс может представить его пользователю или попросить пользователя ввести его. Сегодня многие интерфейсы пользовательского интерфейса мало потокобезопасны, многие из них не являются потокобезопасными, но это изменится. Последовательная обработка (выполнение одной задачи за другой) - это умирающий дизайн, параллельная обработка (выполнение сразу нескольких задач) - это будущее. Просто посмотрите на графические адаптеры. Даже самая современная карта NVidia имеет жалкую производительность, если вы посмотрите на скорость обработки в МГц/ГГц только одного GPU. Как получается, что он может победить дерьмо из процессоров, когда дело доходит до 3D-расчетов? Простой: вместо вычисления одной точки полигона или одного пикселя текстуры за другим, он вычисляет многие из них параллельно (фактически целая группа в одно и то же время), и таким образом он достигает пропускной способности, которая все еще заставляет процессоры плакать. Например. ATI X1900 (чтобы назвать конкурента) имеет 48 шейдерных блоков!
За исключением каркасов, которые не имеют реальной резьбы (BREW). –