Qt Concurrent
Начало работы
Пространство имен QtConcurrent предоставляет высокоуровневые API, которые позволяют писать многопоточные программы без использования примитивов многопоточности низкого уровня, таких как мьютексы, блокировки чтения-записи, условия ожидания или семафоры. Программы, написанные с использованием QtConcurrent, автоматически регулируют количество используемых потоков в соответствии с количеством доступных процессорных ядер. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании на многоядерных системах в будущем.
QtConcurrent включает API в стиле функционального программирования для параллельной обработки списков, включая реализацию MapReduce и FilterReduce для систем с общей памятью (не распределённых), а также классы для управления асинхронными вычислениями в приложениях с графическим интерфейсом пользователя:
-
Параллельное отображение и MapReduce
- QtConcurrent::map() применяет функцию к каждому элементу в контейнере, изменяя элементы на месте.
- QtConcurrent::mapped() подобно map(), за исключением того, что она возвращает новый контейнер с внесёнными изменениями.
- QtConcurrent::mappedReduced() подобно mapped(), за исключением того, что результаты модификаций сводятся или складываются в одно итоговое значение.
-
Параллельное фильтрация и FilterReduce
- QtConcurrent::filter() удаляет все элементы из контейнера на основе результата функции фильтрации.
- QtConcurrent::filtered() подобно filter(), за исключением того, что она возвращает новый контейнер с отфильтрованными результатами.
- QtConcurrent::filteredReduced() подобно filtered(), за исключением того, что отфильтрованные результаты сводятся или складываются в одно итоговое значение.
-
Параллельный запуск
- QtConcurrent::run() выполняет функцию в другом потоке.
- QFuture представляет результат асинхронного вычисления.
- QFutureIterator позволяет итерировать по результатам, доступным через QFuture.
- QFutureWatcher позволяет отслеживать QFuture с использованием сигналов и слотов.
- QFutureSynchronizer — это вспомогательный класс, который автоматически синхронизирует несколько QFuture.
Qt Concurrent поддерживает несколько типов контейнеров и итераторов, совместимых со STL, но лучше всего работает с контейнерами Qt, имеющими итераторы случайного доступа, такие как QList или QVector. Функции map и filter принимают как контейнеры, так и начальные/конечные итераторы.
Обзор поддержки итераторов STL:
| Тип итератора | Примеры классов | Статус поддержки |
|---|---|---|
| Входной итератор | Не поддерживается | |
| Выходной итератор | Не поддерживается | |
| Вперед итератор | std::slist | Поддерживается |
| Двунаправленный итератор | QLinkedList, std::list | Поддерживается |
| Итератор случайного доступа | QList, QVector, std::vector | Поддерживается и рекомендуется |
Итераторы случайного доступа могут быть быстрее в тех случаях, когда Qt Concurrent итерируется по большому количеству лёгких элементов, так как они позволяют перейти к любой точке в контейнере. Кроме того, использование итераторов случайного доступа позволяет Qt Concurrent предоставлять информацию о прогрессе через QFuture::progressValue() и QFutureWatcher::progressValueChanged().
Не изменяющие функции на месте, такие как mapped() и filtered(), создают копию контейнера при вызове. Если вы используете контейнеры STL, эта операция копирования может занять некоторое время, в этом случае мы рекомендуем указать начальный и конечный итераторы для контейнера вместо этого.
Лицензии
Модуль Qt Concurrent доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по бесплатным лицензиям. С Qt 5.4 эти бесплатные лицензии — GNU Lesser General Public License, версия 3 или GNU General Public License, версия 2. Дополнительную информацию см. в Qt Licensing.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qtconcurrent-index.html