JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.2: C++ ユーザーズガイド
search filter icon
search icon

ドキュメントの情報

はじめに

パート I C++ コンパイラ

1.  C++ コンパイラの紹介

2.  C++ コンパイラの使用方法

3.  C++ コンパイラオプションの使い方

パート II C++ プログラムの作成

4.  言語拡張

5.  プログラムの編成

6.  テンプレートの作成と使用

7.  テンプレートのコンパイル

8.  例外処理

9.  プログラムパフォーマンスの改善

10.  マルチスレッドプログラムの構築

10.1 マルチスレッドプログラムの構築

10.1.1 マルチスレッドコンパイルの確認

10.1.2 C++ サポートライブラリの使用

10.2 マルチスレッドプログラムでの例外の使用

10.2.1 スレッドの取り消し

10.3 C++ 標準ライブラリのオブジェクトのスレッド間での共有

10.4 マルチスレッド環境での従来の iostream の使用

10.4.1 マルチスレッドで使用しても安全な iostream ライブラリの構成

10.4.1.1 公開変換ルーチン

10.4.1.2 マルチスレッドで使用しても安全な libC ライブラリを使用したコンパイルとリンク

10.4.1.3 マルチスレッドで使用しても安全な iostream の制約

10.4.1.4 マルチスレッドで使用しても安全なクラスのパフォーマンスオーバーヘッドの削減

10.4.2 iostream ライブラリのインタフェースの変更

10.4.2.1 新しいクラス

10.4.2.2 新しいクラス階層

10.4.2.3 新しい関数

10.4.3 大域データと静的データ

10.4.4 連続実行

10.4.5 オブジェクトのロック

10.4.5.1 stream_locker クラス

10.4.6 マルチスレッドで使用しても安全なクラス

10.4.7 オブジェクトの破棄

10.4.8 アプリケーションの例

10.5 メモリーバリアー組み込み関数

パート III ライブラリ

11.  ライブラリの使用

12.  C++ 標準ライブラリの使用

13.  従来の iostream ライブラリの使用

14.  複素数演算ライブラリの使用

15.  ライブラリの構築

パート IV 付録

A.  C++ コンパイラオプション

B.  プラグマ

用語集

索引

10.5 メモリーバリアー組み込み関数

コンパイラには、SPARC プロセッサと x86 プロセッサ用のさまざまなメモリーバリアー組み込み関数を定義するヘッダーファイル mbarrier.h が用意されています。これらの組み込み関数は、開発者が独自の同期プリミティブを使用してマルチスレッドコードを記述するために使用できます。これらの組み込み関数がいつ必要になるか、また、特定の状況で必要かどうかを判断するために、ユーザーは使用しているプロセッサのドキュメントを参照することが推奨されます。

mbarrier.h によりサポートされるメモリーオーダリング組み込み関数

__compiler_barrier() 組み込み関数を除くすべてのバリアー組み込み関数は、メモリーオーダリング組み込み関数を生成します。x86 では、mfencesfence、または lfence 組み込み関数で、SPARC プラットフォームでは membar 組み込み関数です。

__compiler_barrier() 組み込み関数は、命令を生成せず、代わりに今後メモリー操作を開始する前にそれまでのメモリー操作をすべて完了する必要があることをコンパイラに通知します。この実際の結果として、ローカルでないすべての変数、および static 記憶クラス指定子を持つローカル変数が、バリアー前のメモリーに再度格納されてバリアー後に再ロードされるため、コンパイラではバリアー前のメモリー操作とバリアー後のメモリー操作が混在することはありません。ほかのすべてのバリアーには、__compiler_barrier() 組み込み関数の動作が暗黙的に含まれています。

たとえば、次のコードでは、__compiler_barrier() 組み込み関数が存在しているためコンパイラによる 2 つのループのマージが止まります。

#include "mbarrier.h"
int thread_start[16];
void start_work()
{
/* Start all threads */
   for (int i=0; i<8; i++)
   {
     thread_start[i]=1;
   }
   __compiler_barrier();
/* Wait for all threads to complete */
   for (int i=0; i<8; i++)
   {
      while (thread_start[i]==1){}
   }
}