Qt コンカレント

Qt Concurrent モジュールは、ミューテックス、読み書きロック、待機条件、セマフォといった低レベルのスレッドプリミティブを使用せずにマルチスレッドプログラムを記述することを可能にする高レベル API を提供します。Qt Concurrent で書かれたプログラムは、利用可能なプロセッサコア数に応じて使用するスレッド数を自動的に調整します。つまり、今日書かれたアプリケーションは、将来マルチコアシステムにデプロイされたときにも拡張し続けることができます。

Qt Concurrent には、共有メモリ(非分散)システム用の MapReduce や FilterReduce の実装、GUI アプリケーションの非同期計算を管理するクラスなど、並列リスト処理のための関数型プログラミングスタイルの API が含まれています:

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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。