ランタイムローダーは、アプリケーション、プラグイン、ほかのライブラリーで使用されるインテル® スレッディング・ビルディング・ブロック (インテル® TBB) ダイナミック・ライブラリーのロードに対する追加のランタイム制御を提供します。
#define TBB_PREVIEW_RUNTIME_LOADER 1 #include "tbb/runtime_loader.h"
OS |
リリースビルド |
デバッグビルド |
---|---|---|
Windows® |
tbbproxy.lib |
tbbproxy_debug.lib |
ランタイムローダーは、使用するインテル® TBB のバージョンに対してより細やかなランタイム制御を提供するため、アプリケーション、ライブラリー、またはプラグインにリンク可能なクラスとスタティック・ライブラリーで構成されます。クラスは、ライブラリーを検索するディレクトリーの明示的なリストを使用して、ランタイムにダイナミック・ライブラリーの任意のバージョンをロードできるようにします。スタティック・ライブラリーは、リンク時に依存性を解決できるように、関数とメソッドにスタブを提供します。スタブは、ロードされたインテル® TBB ライブラリーの適切な関数とメソッドに動的に置換されます。
同じモジュール (exe や dll) の class runtime loader のインスタンスはすべて、特定のグローバルステートを共有します。その代表的なものが、ロードされたインテル® TBB ライブラリーです。次のような影響があります。
モジュールごとに 1 つのインテル® TBB ライブラリーのみロードできます。
ある runtime_loader インスタンスによってすでにライブラリーがロードされている場合、同じモジュールによって作成された別のインスタンスは別のライブラリーをロードできません。ロードされているライブラリーが 2 つ目のインスタンスにも適している場合、2 つのインスタンスは協調してライブラリーを使用します。その他の場合はエラーになります (詳細は以下を参照)。
異なるモジュールによりライブラリーの異なるバージョンが要求された場合、ライブラリーをロードすることはできますが、プロセッサーのオーバーサブスクリプションが発生する可能性があります。
runtime_loader オブジェクトはスレッドセーフではないため、同時に使用した場合、正しく動作しない可能性があります。
アプリケーションまたはライブラリーが runtime_loader を使用している場合、通常のインテル® TBB ライブラリーではなく、上記で指定されているライブラリーの 1 つとリンクするべきです。
#define TBB_PREVIEW_RUNTIME_LOADER 1 #include "tbb/runtime_loader.h" #include "tbb/parallel_for.h" #include <iostream> char const * path[] = { "c:\\myapp\\lib\\ia32", NULL }; int main() { tbb::runtime_loader loader( path ); if( loader.status()!=tbb::runtime_loader::ec_ok ) return -1; // ローダーはライブラリーの使用方法には影響しない tbb::parallel_for(0, 10, ParallelForBody()); return 0; }
このサンプルでは、インテル® TBB ライブラリーは c:\myapp\lib\ia32 ディレクトリーからロードされます。明示的にバージョンが指定されていないため、このサンプルのコンパイルに使用したバージョン以上が適切なバージョンになります。ライブラリーがロードされたら、通常の方法で使用することができます。