Qt コンカレント
Qt Concurrent モジュールは、ミューテックス、読み書きロック、待機条件、セマフォといった低レベルのスレッドプリミティブを使用せずにマルチスレッドプログラムを記述することを可能にする高レベル API を提供します。Qt Concurrent で書かれたプログラムは、利用可能なプロセッサコア数に応じて使用するスレッド数を自動的に調整します。つまり、今日書かれたアプリケーションは、将来マルチコアシステムにデプロイされたときにも拡張し続けることができます。
Qt Concurrent には、共有メモリ(非分散)システム用の MapReduce や FilterReduce の実装、GUI アプリケーションの非同期計算を管理するクラスなど、並列リスト処理のための関数型プログラミングスタイルの API が含まれています:
- コンカレントMapとMap-Reduce
- QtConcurrent::map() は、コンテナ内のすべてのアイテムに関数を適用し、アイテムをインプレースで変更する。
- QtConcurrent::mapped() は map() に似ているが、修正された新しいコンテナを返す点が異なる。
- QtConcurrent::mappedReduced()はmapped()と似ているが、修正された結果が縮小されるか、1つの結果に折り畳まれる点が異なる。
- 並行フィルタとフィルタ削減
- QtConcurrent::filter() は、フィルタ関数の結果に基づいてコンテナからすべての項目を削除します。
- QtConcurrent::filtered() は filter() と同じですが、フィルタリングした結果を新しいコンテナとして返す点が異なります。
- QtConcurrent::filteredReduced() は filter() と似ていますが、フィルタリングされた結果が縮小または折りたたまれて 1 つの結果になる点が異なります。
- 同時実行
- QtConcurrent::run() は、別のスレッドで関数を実行します。
- 同時実行タスク
- QtConcurrent::task() は、QtConcurrent::QTaskBuilder のインスタンスを作成します。 このオブジェクトは、パラメータの調整や、別スレッドでのタスクのキックオフに使用できます。
- QFuture は、非同期計算の結果を表します。
- QFutureIterator QFuture を介して利用可能な結果を反復処理できます。
- QFutureWatcher シグナル・アンド・スロットを使って を監視することができる。QFuture
- QFutureSynchronizer は、複数のQFutureを自動的に同期させる便利なクラスです。
- QPromise 非同期計算の進捗と結果を に報告する方法を提供します。 から要求があった場合、タスクの中断やキャンセルを可能にします。QFuture QFuture
Qt Concurrent は、いくつかの STL 互換のコンテナとイテレータ型をサポートしていますが、QList のようなランダムアクセスのイテレータを持つ Qt コンテナで最もよく機能します。map 関数と filter 関数は、コンテナと begin/end イテレータの両方を受け入れます。
STL イテレータサポートの概要
イテレータ型 | クラス例 | サポート状況 |
---|---|---|
入力イテレータ | 未サポート | |
出力イテレータ | 未サポート | |
順方向イテレータ | 標準::スリスト | サポートあり |
双方向イテレータ | 標準::リスト | サポート |
ランダムアクセス反復子 | QListstd::vector | サポートおよび推奨 |
ランダムアクセスイテレータは、コンテナ内の任意のポイントにスキップできるため、Qt Concurrentが大量の軽量アイテムに対して反復処理を行う場合に高速化できます。さらに、ランダムアクセスイテレータを使用することで、Qt Concurrent はQFuture::progressValue() やQFutureWatcher::progressValueChanged() を通じて進捗情報を提供することができます。
mapped()やfiltered()のようなインプレースで変更しない関数は、呼び出されたときにコンテナのコピーを作成します。STLコンテナを使用している場合、このコピー操作に時間がかかることがあります。この場合、代わりにコンテナのbeginとendイテレータを指定することをお勧めします。
モジュールの使用
Qt モジュールを使用するには、モジュール・ライブラリを直接、または他の依存関係を通してリンクする必要があります。CMakeや qmakeなど、いくつかのビルドツールはこのための専用サポートを持っています。
CMakeでビルドする
find_package()
コマンドを使って、Qt6
パッケージの中から必要なモジュールコンポーネントを探します:
find_package(Qt6 REQUIRED COMPONENTS Concurrent) target_link_libraries(mytarget PRIVATE Qt6::Concurrent)
CMakeによるビルドの概要も参照してください。
qmakeでビルドする
モジュールをqmakeでビルドするように設定するには、プロジェクトの.proファイルにQT
変数の値としてモジュールを追加します:
QT += concurrent
例
モジュールの進化
Qt Concurrent の変更点には、Qt 6 シリーズの Qt で行われたモジュールの API と機能の重要な変更点が記載されています。
ライセンス
Qt Concurrent モジュールは、The Qt Company の商用ライセンスで利用できます。さらに、フリーソフトウェアライセンスでも利用可能です:GNU Lesser General Public License(バージョン 3)、またはGNU General Public License(バージョン 2)です。詳細はQt ライセンスを参照してください。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。