並列プログラミング ライブラリの TParallel.For の使用
並列プログラミング ライブラリの使用 への移動
並列プログラム ライブラリ(PPL)は、ループ関数 TParallel.For を含んでおり、そのループを並列に実行することができます。
並列ループ内で、オペレーションをスレッドセーフのオペレーションに変換しなければなりません。System.SyncObjs ユニットのメンバー(TInterlocked メソッドなど)を使用することができます。
For ループを TParallel.For
ループに変換する
Delphi:
For ループ | TParallel.For Loop |
---|---|
for I := 1 to 10 do
begin
// …
end;
|
TParallel.For(1, 10, procedure(I: Integer)
begin
// …
end);
|
C++:
Clang 拡張 C++ コンパイラを使用している場合、ラムダ式を使用することができます:
For ループ | TParallel.For Loop |
---|---|
for (int i = 1; i <= 10; i++) {
// …
}
|
TParallel::For(0, 10, TProc1<int>([](int I){
// …
}));
|
代わりに ファンクタを使用することもできます。これは、前世代コンパイラと Clang 拡張コンパイラの両方で動作します:
For ループ | TParallel.For Loop |
---|---|
for (int i = 1; i <= 10; i++) {
// (Loop logic)
}
|
class TMyFunctor : public TCppInterfacedObject<TProc__1<int> > {
public:
void __fastcall Invoke(int I) {
// (Loop logic)
}
};
// …
TParallel::For(1, 10, System::DelphiInterface<TProc__1<int> >(new TMyFunctor()));
|
ループが、コールバック関数の外で、コンテキストから 1 つまたは複数の変数にアクセスする必要がある場合に、ファンクタを次のように使用する必要があります:
- ファンクタ クラスで変数を宣言し、必要とする変数のコピーか参照を保持します。
- それら変数のコピーまたは参照をパラメータとして受け取る、ファンクタ クラスのコンストラクタを宣言し、対応するファンクタ変数を、それらの値で初期化します。
- それらの変数を、ファンクタをインスタンス化する際に、コンストラクタに渡します。
- プログラム ロジックでは、
Invoke()
で、それらのファンクタ変数にアクセスすることができます。
例:
class TMyFunctor : public TCppInterfacedObject<TProc__1<int> > {
public:
TMyFunctor(int a, TB *b) : a(a), b(b) {}
void __fastcall Invoke(int I) {
// (Loop logic)
}
int a;
TB *b;
};
// …
TParallel::For(1, 10, System::DelphiInterface<TProc__1<int> >(new TMyFunctor(a, b)));