2016-04-17 8 views
2

C11およびC++ 11標準では、の可能性のある共有メモリロケーションというステートメントが表示されます。これは何を意味するのでしょうか?すべてのグローバル変数は、マルチスレッド環境で潜在的に共有されていますか?潜在的に共有メモリの場所は何ですか?

+0

これを決定するのは実装次第です。実装が不可能であることが証明できない限り、何かが共有される可能性があります。 –

+0

C++ 14では、似ているのは "潜在的に共有メモリの場所"です。 ** [intro.multithread] **の非規範的な注釈の両方で、2回現れます。特定の最適化の合法性を議論しているように、「他のスレッドがアクセスする可能性をオプティマイザが排除できないメモリ位置」を意味するように見えます。 –

+0

@Igor Tandetnik質問が修正されました。ありがとうございます。 – mrn

答えて

2

C標準に詳しくはありません。 C++ 14では、語句 "潜在的に共有メモリ・ロケーション" は、2つの非規範的なノートに、二回現れる:

[intro.multithread]/25 [注に割り当てを導入コンパイラ変換潜在的に共用メモリ位置は抽象マシンによって変更されないが、抽象マシン実行がデータ競合に遭遇しなかった場合に別のスレッドによる別の割り当てを上書きする可能性があるため、この規格では一般に排除される。これには、別々のメモリ位置にある隣接メンバを上書きするデータメンバ割り当ての実装が含まれます。問題のアトミックがエイリアシングする場合の原子負荷の並べ替えは、これが一貫性の規則に違反する可能性があるため、一般的に排除される。 - エンドノート]

[intro.multithread]/26 [注:で定義されるようにC++プログラムのセマンティクスを保持しないことがあり潜在的に共有メモリロケーションの先読みを導入変換データレースを導入する可能性があるため、この規格を採用しています。ただし、データ競合のセマンティクスが明確な特定のマシンをターゲットとする最適化コンパイラのコンテキストでは、通常は有効です。レースに寛容ではない仮想マシンやハードウェアレースの検出には無効です。 - エンドノート]

文脈から、それは、「潜在的に共有メモリの場所が」「オプティマイザは、他のスレッドがアクセスする可能性を排除できないためにメモリ位置を意味することになっていることはかなり明らかだとそうする可能性があるとの悲観的な前提で進めるべきだ」と述べた。この2つのノートは、そのような前提の下で行われる場合とされない場合がある特定の最適化の合法性について議論します。

Re:グローバル変数。はい、グローバル変数は通常、任意のスレッドからアクセス可能です。原則として、プログラム全体の最適化を実行する洗練されたオプティマイザは、特定のグローバル変数が複数のスレッドから同時にアクセスされないことを証明することができるかもしれません(現存するコンパイラは現在認識されていませんfeat。しかし、私は自分自身をコンパイラーのエキスパートと呼んでいません)。グローバル変数が占めるメモリ位置は、オプティマイザによって潜在的に共有されるものとして扱われるべきである。

関連する問題