Qt Concurrent

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

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

Qt Concurrent 複数の STL 互換コンテナとイテレータ型をサポートしますが、 のようなランダムアクセス・イテレータを持つ Qt コンテナで最もよく機能します。map関数とfilter関数は、コンテナとbegin/endイテレータの両方を受け入れます。QList

STL イテレータサポートの概要

イテレータ型クラス例サポート状況
入力イテレータ未サポート
出力イテレータ未サポート
順方向イテレータ標準::スリストサポートあり
双方向イテレータ標準::リストサポート
ランダムアクセス反復子QListstd::vectorサポートおよび推奨

ランダムアクセス・イテレータは、Qt Concurrent 、コンテナ内の任意のポイントにスキップできるため、大量の軽量アイテムを反復処理する場合に高速化できる。さらに、ランダムアクセス・イテレータを使用することで、QFuture::progressValue() やQFutureWatcher::progressValueChanged() を通じてQt Concurrent に進捗情報を提供することができる。

mapped()やfiltered()などの非インプレイス変更関数は、呼び出されるとコンテナのコピーを作成します。STL コンテナを使用している場合、このコピー処理に時間がかかることがあります。このような場合は、代わりにコンテナの開始イテレータと終了イテレータを指定することをお勧めします。

モジュールの使用

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, version 3, またはGNU General Public License, version 2.詳細はQt ライセンスを参照してください。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.