インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

Microsoft* Foundation Class とインテル® Cilk™ Plus プログラム

インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」を参照してください。

このトピックは、Windows* 開発者向けです。

Microsoft* Foundation Class (MFC) ライブラリーは、クラスラッパーからオブジェクトの GDI ハンドラーをマップするスレッド・ローカル・ストレージに依存します。インテル® Cilk™ Plus のストランドは、どの OS スレッドでも実行できるわけではないため、インテル® Cilk™ Plus を使用する並列コードでは MFC 関数を安全に呼び出すことができません。

通常、MFC ベースのアプリケーションで計算集約的なタスクを実行する方法は 2 つあります。

ランタイムシステムは OS スレッドを切り替えることができるため、インテル® Cilk™ Plus コードはスレッド・ローカル・ストレージに依存する MFC などのコードと分離する必要があります。

MFC プログラムに演算スレッドを追加するには、次の操作を実行します。

  1. OS 機能 (_beginthreadexAfxBeginThread) を使用して演算スレッドを作成します。インテル® Cilk™ Plus に変換する C++ コードはすべてこのスレッドで実行する必要があります。演算スレッドによりメイン (UI) スレッドは計算集約的なタスクから解放され、メッセージポンプを実行して、ウィンドウメッセージの処理と UI の更新を行うことができます。

  2. UI ウィンドウのハンドル (HWND) を演算スレッドに渡します。UI の更新が必要になると、演算スレッドは PostMessage を呼び出して UI スレッドにメッセージを送信します。PostMessage はメッセージをマーシャリングして、ウィンドウハンドルを作成したスレッドに関連付けられているメッセージキューに追加します。SendMessage は使用しないでください。SendMessage は、正しい (UI) スレッドではない現在実行中のスレッドで実行されます。

  3. C++ プログラムをテストして、ロジックとスレッド管理が正しいことを確認します。

  4. 演算スレッドのロジックにインテル® Cilk™ Plus 構造を追加します。

  5. 終了する前に、メイン (UI) スレッドは WaitForSingleObject() を使用して、演算スレッドが完了するのを待機しなければなりません。

製品に含まれる QuickDemo サンプルプログラムは、インテル® Cilk™ Plus アプリケーションで MFC を使用する例を示します。

その他の推奨事項: