Oracle® Developer Studio 12.5: C++ ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

11.2.3 バンドルされている不可分ライブラリ

不可分機能はオペレーティングシステムからの実行時サポートを必要とする C11 および C++11 標準の新しい言語機能です。不可分機能の使用については、atomic_fence(3A)atomic_flag(3A)、および stdatomic.h(3A) のマニュアルページを参照してください。

この実行時サポートの標準インタフェースはまだ存在しないため、gcc 不可分ライブラリと Oracle Developer Studio 不可分ライブラリの間にわずかな違いがあります。

GCC は、Oracle Solaris 11.3 および Oracle Linux 7.x 上の /usr/lib に含まれている libatomic.so と呼ばれる実行時ライブラリで不可分機能をサポートします。

Oracle Developer Studio 12.5 コンパイラは、libstatomic.so と呼ばれる新しい実行時ライブラリで不可分機能をサポートします。このライブラリは Oracle Developer Studio リリースにバンドルされていて、Oracle Solaris または Oracle Linux には含まれていません。これは GCC ライブラリおよび Oracle Developer Studio ライブラリをマージして Oracle Solaris に組み込みでき、かつ Oracle Linux にバンドルされたライブラリが標準インタフェースに準拠するまでの暫定的な解決方法です。

libstatomic.so ライブラリはテスト済みで、GCC 不可分ライブラリ libatomic との互換性で説明されているいくつかの例外を除いて libstatomic.so の GCC 4.8、4.9、および 5.1 リリースと互換性があります。

新しいコンパイラオプション –xatomic によって、プログラムおよびライブラリをリンクするときに GCC libatomic ライブラリまたは Oracle Developer Studio の libstatomic ライブラリのどちらを使用するかを指定できます。

11.2.3.1 不可分ライブラリの選択

Oracle Developer Studio 不可分ライブラリ (libstatomic.so) または GCC 不可分ライブラリ (libatomic.so) のいずれかを使用できますが、一緒にリンクされる実行可能ファイルおよびライブラリの間で一貫性を保つことが重要です。実行中のプロセスで使用される不可分ライブラリは 1 つだけにします。


注 -  不可分機能を使用する gcc 組み込みライブラリとの互換性を確保する必要がない場合、Oracle Developer Studio コンパイラと一緒に libstatomic.so を使用します。

リンク時に使用されるライブラリを制御するには、–xatomic オプションを使用します。Oracle Developer Studio のライブラリ libstatomic にリンクするには –xatomic=studio を使用し、GCC のライブラリ libatomic にリンクするには –xatomic=gcc を使用します。ライブラリとのリンクを行わない場合は、–xatomic=none を使用します。

GCC コンパイラを使用する既存のメイクファイルまたはソースコードの移植に役立つように、–latomic がコンパイラに渡された場合、そのオプションは –xatomic=studio に変換されます。

C++ プログラムの場合、不可分サポートライブラリは必要なときにデフォルトでリンクされます。


注 -  –xatomic=none オプションにより、アプリケーションは Oracle Developer Studio libstatomic インストールディレクトリを実行パスとして持たなくなります。–xatomic=none でライブラリ関数を呼び出すアプリケーションを構築するには、libstatomic.so を構築時に明示的にリンクするようにします。

libstatomic.so を使用するアプリケーションの配備

バンドルされている不可分ライブラリ libstatomic.so は、Oracle Developer Studio 製品の一部として完全にサポートされています。ライブラリを使用するアプリケーションを配備できますが、Oracle Developer Studio がインストールされているシステム上でアプリケーションが実行される場合を除き、ライブラリを含める必要があります。

  1. 実行可能ファイルから listatomic.so への実行時パスを決定します。

    例:

    ./lib
  2. libstatomic.so への構築時パスを決定します。

    例:

    build-path/import/libstatomic.so
  3. リンク手順に –xatomic=none を追加します。
  4. 新しいリンク時オプションを追加します。

    例:

    –R runtime-path build-path-to-atomics/libstatomic.so.1
  5. libstatomic ライブラリを独自の製品インストールツリーにコピーします。
使用例 3  myprog 実行可能ファイルでの libstatomic.so の追加

次の例では、Oracle Developer Studio がインストールされていない 64 ビット SPARC プラットフォーム上にアプリケーションを配備します。

アプリケーションを構築マシン上に構築する前に、実行可能ファイルを基準にして libstatomic が配置される場所を決定します。たとえば、アプリケーションが app_root に配置されており、libstatomic ライブラリが app_root/lib にある場合、ライブラリの相対的なディレクトリは ./lib です。

bash-4.1$ ls app_root/
lib     myprog
bash-4.1$ ls app_root/lib/
libstatomic.so    libstatomic.so.1

構築マシン上で libstatomic.so が配置される場所を決定します。たとえば、Oracle Developer Studio が install-dir/ にインストールされる場合、libstatomic.soinstall-dir/lib/compilers/atomic/sparcv9/libstatomic.so に配置されます。

次のコマンドを使用して、プログラムをコンパイルします。

$ install-dir/bin/CC -m64 [compiler-options] -xatomic=none myprog.cc -o myprog -R'$ORIGIN'/lib install-dir/lib/compilers/atomic/sparcv9/libstatomic.so

配備マシン上にパッケージディレクトリを作成します。

次に、64 ビットの libstatomic.so ライブラリを app_root/lib にコピーします。

$ cp install-dir/lib/compilers/atomic/sparcv9/libstatomic.so app_root/lib

myprog について生成された実行可能ファイルを app_root ディレクトリにコピーします。これにより、実行時リンカーは myprog が実行されたときに ./lib の下に libstatomic.so を見つけます。

$ cp myprog.out app_root

11.2.3.2 GCC 不可分ライブラリ libatomic との互換性

使用するアプリケーションまたはライブラリが不可分機能を使用し、そのアプリケーションまたはライブラリが GCC バージョンの libatomic を使用する実行可能ファイルおよびライブラリと相互運用する必要がある場合、Oracle Developer Studio プログラムを GCC バージョンの libatomic とリンクする必要があります。プログラム内の不可分実行時ライブラリのバージョンが 1 つだけになるよう注意する必要があります。

Oracle Developer Studio の C および C++ プログラムを GCC バージョンの libatomic とリンクするには、コンパイラオプション –xatomic=gcc を使用します。

GCC バージョンの libatomic/usr/lib に存在しない古いシステムでリンクおよび実行する場合、不可分機能のサポートの非互換性について懸念する必要はありません。そのような状況では、使用される不可分ライブラリがほかに存在しないため、libstatomic を GCC バイナリと組み合わせてシステム上で使用できます。

Oracle Developer Studio コンパイラは libstatomic ライブラリと一緒に使用すると最適に動作しますが、GCC の libatomic バージョン 1.1 と互換性があり、次に示すような既知の課題があります。

  • libatomic 1.0.0 を含む GCC 4.8 - このバージョンの libatomic は、C 11 プログラムの浮動小数点不可分機能を使用しない場合、C11 および C++11 の不可分機能をサポートします。GCC 4.8 コンパイラ自体は、将来のリリースまで C11 をサポートしません。

  • libatomic 1.1 を含む GCC 4.9 および 5.1 - このバージョンは、C11 用の浮動小数点不可分機能を含み、これらのバージョンを持つ GCC コンパイラは C11 の不可分機能のキーワードをサポートします。


    注 -  使用する C11 プログラムが不可分関数のアドレスを取得する場合があり、これは非汎用関数についてのみ有効です。これは libatomic 1.0.0 または libatomic 1.1 では、すべての atomic 関数がコンパイラによって常にインライン化され、ライブラリ内にコードは必要ないことを前提にしているため、これらのライブラリではこれが正しく機能しません。これらの関数のリストは不可分機能のマニュアルページで確認できます。これらの関数ポインタを取得する必要がある場合は、libstatomic を使用するようにしてください。

Oracle Linux 7.x および Oracle Solaris 11.3 には libatomic 1.0.0 を含む GCC 4.8 が含まれています。

11.2.3.3 実装上の注意

実行可能ファイルや共有ライブラリなどの複数のコンポーネントが不可分実行時を必要とするとき、各コンポーネントを適切な –xatomic オプションで動的にリンクして、正しい動的依存関係を作成するようにしてください。ライブラリがリンクされるときに不可分オプションの提供を必要とする共有ライブラリを生成しないようにしてください。

同じプロセス内で両方の実行時ライブラリを使用することは、次の理由によりお勧めしません。

  • 一部の不可分型では、同期を実行するために実行時サポートライブラリの呼び出しが必要です。2 つの実行時システムは内部データ構造が異なるため、2 つのライブラリは同じオブジェクトを同期できません。

  • Oracle Developer Studio ライブラリ libstatomiclibatomic と同じ関数の大域シンボル名を使用します。同じプロセス内で両方のライブラリが使用された場合、実行可能ファイルまたはライブラリが予期しないライブラリ内の関数を呼び出す可能性があります。

両方の実行時ライブラリを使用しようとするプログラムは最初は動作するようにみえますが、失敗する可能性が高くサポートできません。


注 -  –latomic を使用したリンクは、/usr/lib/libatomic.so.1 を使用したリンクになりません。このライブラリは GCC 実装で、主として、互換性のあるライブラリが Oracle Solaris および Oracle Linux でリリースされるまで GCC で使用されるためのものです。

不可分演算の多くはインライン化されるため、アプリケーションは不可分実行時ライブラリに依存せずに不可分機能を使用できる可能性があります。動作は実装に固有となるため、コンパイラをアップグレードした場合に結果が変化する可能性があります。使用するアプリケーションがスカラー型の不可分型 (flagscharintlong、または pointers) のみ使用し、x86 プラットフォーム上で構築される場合、生成されるバイナリで libstatomic が不要となることがあります。そのようなアプリケーションまたはライブラリを –xatomic=none オプションでコンパイルしてみて、正しくリンクされ実行されるか確認することもできます。