[Предыдущая: Потоки и объекты QObjects] [Поддержка потоков в Qt] [Следующая: Поддержка потоков в модулях Qt]
Параллельное программирование
Пространство имен QtConcurrent предоставляет высокоуровневые API, которые делают возможным написание многопоточных программ без использования низкоуровневых потоковых примитивов, таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры. Программы, написанные с помощью QtConcurrent, автоматически приводят количество используемых потоков в соответствие с доступным количеством процессорных ядер. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании на многоядерных системах в будущем.
QtConcurrent включает в себя несколько API функционального стиля программирования для параллельной обработки списков, включая реализации MapReduce и FilterReduce для систем с разделяемой памятью (shared-memory) (не распределенных), и классов для управления асинхронными вычислениями в приложениях с ГПИ:
- QtConcurrent::map() применяет функцию к каждому элементу в контейнере, изменяя элементы на месте.
- QtConcurrent::mapped() похожа на map() за исключением того, что она возвращает новый контейнер с изменениями.
- QtConcurrent::mappedReduced() похожа на mapped() за исключением того, что модифицированные результаты преобразуются (reduced) или свёртываются (folded) в единственный результат.
- QtConcurrent::filter() удаляет все элементы из контейнера, основываясь на результате фильтр-функции.
- QtConcurrent::filtered() похожа на filter() за исключением, того что он возвращает новый контейнер с отфильтрованными результатами.
- QtConcurrent::filteredReduced() похожа на filtered() за исключением того, что отфильтрованные результаты уменьшены или свёрнуты в единственный результат.
- QtConcurrent::run() запускает функцию в другом потоке.
- QFuture представляет результат асинхронных вычислений.
- QFutureIterator делает возможным процесс итерации по результатам, доступным через QFuture.
- QFutureWatcher делает возможным слежение за QFuture, используя сигналы и слоты.
- QFutureSynchronizer - вспомогательный класс, который автоматически синхронизирует несколько объектов QFuture.
Qt Concurrent поддерживает несколько STL-совместимых контейнерных и итераторных типов, но лучше работает с контейнерами Qt, которые имеют итераторы случайного доступа (random-access), например, QList или QVector. Функции map и filter работают как с контейнерами, так и с начальными/конечными итераторами.
Обзор поддержки итераторов STL:
Тип итератора | Пример классов | Статус поддержки |
Итератор ввода (Input Iterator) | | Не поддерживается |
Итератор вывода (Output Iterator) | | Не поддерживается |
Итератор пересылки (Forward Iterator) | std::slist | Поддерживается |
Двунаправленный итератор (Bidirectional Iterator) | QLinkedList, std::list | Поддерживается |
Итератор случайного доступа (Random Access Iterator) | QList, QVector, std::vector | Поддерживается и рекомендуется |
В тех случаях, когда Qt Concurrent осуществляет перебор большого количества небольших элементов, итераторы случайного доступа могут быть быстрее, так как они позволяют перепрыгивать (skipping) в любую точку в контейнере. Кроме того, использование итераторов с произвольным доступом разрешает Qt Concurrent предоставить информацию о прогрессе выполнения посредством QFuture::progressValue() и QFutureWatcher:: progressValueChanged().
Функции, не изменяющие элементы на месте, такие как mapped() и filtered(), создают при вызове копию контейнера. Если вы используете контейнеры STL, эти операции копирования могут занять некоторое время, вместо этого мы рекомендуем в этом случае определить начальный и конечный итераторы для контейнера.
[Предыдущая: Потоки и объекты QObjects] [Поддержка потоков в Qt] [Следующая: Поддержка потоков в модулях Qt]
Авторские права © 2010 Nokia Corporation и/или её дочерние компании |
Торговые марки |
Qt 4.6.4 |
|