Я думаю, что это отличный вопрос. Итак, я начал серию сообщений в блогах об этом here.
Ответ Dmckee правильный в самом узком смысле. Позвольте мне перефразировать в моих собственных слов здесь, неявно в том числе некоторые из комментариев:
Там нет значения в распараллеливание операции, которые не являются ЦП. Существует небольшое значение в параллелизме операций, которые связаны только с процессором для коротких периодов времени, скажем, менее несколько сотен миллисекунд. Действительно, , делая это, скорее всего, вызовет сложность программы и ошибки. Изучение того, как реализовать мелкозернистый , затруднено и делает , это хорошо.
Это верно, насколько это возможно, но я верю, что ответ богаче для более широкого набора программ. Действительно, Есть много причин использовать многопоточные, а затем неявно многоядерные методы в ваших производственных приложениях. Например, огромные преимущества для ваших пользователей - переносить операции ввода-вывода на диске и в сети из потока пользовательского интерфейса.
Это не имеет никакого отношения к увеличению пропускной способности операций, связанных с вычислением, и все, что нужно для поддержания пользовательского интерфейса программы. Обратите внимание, что здесь не нужен графический интерфейс - программы командной строки, службы и серверные приложения, также могут пригодиться для этого.
Я полностью согласен с тем, что выполнение операции с привязкой к ЦП и ее парализация часто может быть сложной задачей, требующей знания тонкозернистой синхронизации, кэширования ЦП, схем инструкций процессора и т. Д. И т. Д. Действительно, это может быть классически «жестким», ,
Но, я бы сказал, что необходимость делать его редко; существует не так много проблем, которые требуют такого мелкозернистого параллелизма. Да! они существуют, и вы можете заниматься этим каждый день, но я бы сказал, что в повседневной жизни большинства разработчиков это довольно редко.
Несмотря на это, есть веские основания для изучения основ многопоточного и, следовательно, многоядерного развития.
- Это может сделать вашу программу более восприимчивой с точки зрения пользователя, перемещая более длительные операции из потока потока сообщений.
- Даже для вещей, которые не связаны с ЦП, часто бывает целесообразно делать их параллельно.
- Он может разбивать сложные однопоточные государственные машины на более простой, более процедурный код.
Действительно, ОС уже здесь много для вас, и вы можете использовать библиотеки с многоядерным включением (например, Intel's stuff). Но операционные системы и библиотеки не являются волшебными - я утверждаю, что для большинства разработчиков важно изучить основы многопоточного программирования. Это позволит вам писать лучшее программное обеспечение, с которым ваши пользователи счастливы.
Конечно, не каждая программа должна быть многопоточной или многоядерной. Это просто прекрасно, что некоторые вещи могут быть реализованы простым однопоточным способом. Поэтому не принимайте это за консультацию, что каждая программа должна быть многопоточной - используйте свое собственное хорошее мнение здесь. Но это часто может быть ценной техникой и очень полезно во многих отношениях. Как уже упоминалось выше, я планирую вести блог об этом немного, начиная с here. Не стесняйтесь следовать и оставлять комментарии там, когда вы чувствуете себя склонными.
Какие новые проблемы имеют многоядерные процессоры по сравнению с многопоточными? Многопоточность - старая тема, очень используемая с графическими интерфейсами и для измельчения данных. – DonkeyMaster
@DonkeyMaster Локальность ссылки при наличии иерархии кэшей - это новая проблема с многоядерным. –