必要条件

この記事に必要な予備知識

このチュートリアルでは、C++ プログラミング言語の理解と Adobe Flash C++ コンパイラの実用知識が必要です。並列プログラミングのテクニックを理解していると、この記事を最大限に活用できます。

ユーザーレベル

中級

原文 作成日: 2012/12/3
Multithreaded C++ programming with the Adobe Flash C++ Compiler (FlasCC)

Adobe Flash C++ コンパイラ (FlasCC) には、SWF バージョン 18 以上、Flash Player 11.5 以上をターゲットする場合の POSIX スレッド (Pthread) API をサポートしています。この API によって、スレッドの作成と管理のほか、mutex や条件プリミティブによるスレッド間の同期が行えます。この記事では、Pthread と、セマフォ、アトミック操作、および OpenMP などの関連する技術の概要を Flash ランタイムにからめて説明します。この記事に使用するサンプルファイルをダウンロードすると、これらの技術が C++ でどのように実装されるかを確認できます。

Pthread

Pthread API は、単一のアプリケーションに複数の実行スレッドを作成する機能によって、並列プログラミングテクニックと複数の CPU コアの使用を実現しています。C または C++ プログラムでは、pthread.h ヘッダーをインクルードすることによって、Pthread データ構造と関数が定義されます。すべての必要なライブラリは、–pthread GCC コンパイラオプションによって確実に、最終アプリケーションにリンクされます。

スレッドの存続期間

新しい実行スレッドは、pthread_create 関数を使って作成されます。スレッドは、リソースのリークを防止するために、終了したら 結合 する必要があります。スレッドの結合には pthread_join 関数を使用します。

同期プリミティブ

この記事のサンプルファイルに、スレッドの作成と結合、および固定容量のキューのブロックを実装する様々な Pthread 同期プリミティブを説明する pthreads.cpp が含まれます。この例では、pthread_mutex_init で作成された mutex と pthread_cond_init で作成された condition を使用しています。

セマフォおよびアトミック操作

Flascc は、semaphore.h ヘッダーで定義された sem_ データ構造と関数によって計数セマフォをサポートしています。セマフォは、一般的に、制限された数のリソースにアクセスする無制限の数のスレッドを調整するために使用されます。
Flascc は、アトミック操作の __sync_ もサポートしています。これらのアトミック操作では、同期的な整数のインクリメントや特に整数とポインタのコンペア・アンド・スワップなど、整数とポインタの値の同期操作を行えます。これらのプリミティブ操作によって、さまざまなロックフリーアルゴリズムを実装できます。

セマフォ

sema.cpp ファイルでは、ブロッキング固定容量キューを実装するために sem_init で作成されたセマフォの使用方法を示しています。この例では、制限されたリソースは、キューの利用可能なスロットの数です。

アトミック操作

atomic.cpp サンプルファイルでは、ロックフリーの連結リスト追加操作を実装するために __sync_ プリミティブの使用方法を示しています。サポートされているアトミック操作の詳細については、このページを参照してください。

OpenMP

OpenMP は、明示的なスレッド管理と同期が存在しない並列プログラミングを可能にする API とコンパイラディレクティブのセットです。C または C++ プログラムでは、omp.h ヘッダーをインクルードすることにって、OpenMP に関連するデータ構造と関数を定義します。ただし、多くの場合、コンパイラディレクティブはそれ自身で十分な場合があるため、OpenMP API を直接呼び出す必要はありません。–fopenmp コンパイラオプションは、コンパイラが OpenMP コンパイラディレクティブを尊重し、必要なライブラリにリンクするようにします。このオプションには、–pthread オプションが必要です。
チュートリアルや便利な構文クイックリファレンスカードなど、OpenMP のその他の情報については、http://openmp.org を参照してください。

サンプル

openmp.cpp サンプルファイルでは、コンパイラディレクティブが一部の単純な並列計算を実行できるように omp parallel の使用方法が示されています。このディレクティブに関する詳細については、OpenMP 仕様書の「Parallel Loop [2.6.1]」または構文クイックリファレンスカードを参照してください。

スレッドとワーカー

Flascc Pthread is implemented using ActionScript worker. By creating a Pthread, Pthread the start_routineAS3 Worker object to be executed it will be created. Workers that have been created in the execution of Pthread share and automatically other Pthread the C memory (including the main Pthread). Global variables and static variables are shared by Pthread. Therefore, (a pointer to a scalar, function pointers, etc.) C data can be safely shared between Pthresd. However, because the value of the AS3 is not shared between workers, it can not be shared between general Pthread. In workers.cpp sample file, it shows the relationship between the worker and Pthread.
This relationship, SWIG (flascc the installation docs/Reference.htmlis especially important when using the reference to "Creating SWCs with SWIG" in the "flascc Reference Guide"). SWIG can dynamically create a C function pointer from the AS3 function, and vice versa. These function pointers that have been created by SWIG, in order to encapsulate the AS3 function, it can not be shared among workers. In other words, it can not be shared between Pthread.

UI ワ ー カ ー

In Pthread-enabled applications that are built using the Flascc, the main entry point, in order to avoid a time-out due to run over a long period of time, and then run in the background worker. The basic or "UI" workers, when the other threads to perform I / O request, when using the Flash ++, or avm2_ui_thunk(flascc the installation docs/capidocs/avm2.htmland regularly service the request that was created when calling the see). Request is executed falsely the thread that issues the request. In addition, custom Console (the flascc install docs/Reference.html"of flascc Reference Guide in the Implementing a Console When you use the reference to"), UI worker can execute the C code in other situations. This code works as if they are running from different Pthread from other Pthread that are explicitly created from the main Pthread and Pthread. As the main thread and explicitly Pthread that have been created, the UI worker, pthread_getspecific/pthread_setspecificand its own thread local storage that can be accessed via a pthread_selfunique of the returns pthread_tthere is.

Flash++

Flascc には、Flash API の C++ ラッパークラスが提供されています。–lFlash++–lAS3++ をコンパイラに渡して Flash++.h のインクルードと適切なライブラリとのリンクを行うことによって、これらのラッパークラスを使用できるようになります。

それぞれのラッパークラスには、2 つのバリアントがあります。最初のバリアントは、名前空間 AS3::local にある「ローカル」バリアントです。これらのクラスは、ワーカーの実行において AS3 の値で実行します。つまり、マウスまたはキーボード入力、クリップボードなどへのアクセスは、基本/UI ワーカー外では機能しません。この種のクロスワーカー共有は、デバッグが困難なランタイムエラーにつながります。つまり、Pthread 間で共有できません。

2 つ目のバリアントは、名前空間 AS3::ui にある「ui」バリアントです。これらのクラスは、基本/UI ワーカーで管理された AS3 の値で実行します。この種のバリアントへのアクセスは基本/UI ワーカーに自動的にデリゲートされるため、ワーカー/Pthread 間で共有でき、任意のワーカー/Pthread から UI 機能にアクセスするために使用できます。このデリゲートには、パフォーマンス上のオーバーヘッドがあるため、パフォーマンスを優先する場合は注意して使用する必要があります。

flash++flavors.cpp サンプルファイルでは、Flash++ クラスの 2 つのバリアントの違いを説明し、これらが Pthread や ワーカーと対話する様子が示されています。flash++ui.cpp サンプルファイルでは、複数のスレッドから Flash API と対話するために、Flash++ の「ui」バリアントを使用しています。

次のステップ

By threading support of Flascc, developers use the powerful concurrent programming techniques, while responding to the audience of a wide range of Flash runtime, you can take advantage of modern multi-core CPU.