C11およびC++ 11標準では、の可能性のある共有メモリロケーションというステートメントが表示されます。これは何を意味するのでしょうか?すべてのグローバル変数は、マルチスレッド環境で潜在的に共有されていますか?潜在的に共有メモリの場所は何ですか?
答えて
C標準に詳しくはありません。 C++ 14では、語句 "潜在的に共有メモリ・ロケーション" は、2つの非規範的なノートに、二回現れる:
[intro.multithread]/25 [注に割り当てを導入コンパイラ変換潜在的に共用メモリ位置は抽象マシンによって変更されないが、抽象マシン実行がデータ競合に遭遇しなかった場合に別のスレッドによる別の割り当てを上書きする可能性があるため、この規格では一般に排除される。これには、別々のメモリ位置にある隣接メンバを上書きするデータメンバ割り当ての実装が含まれます。問題のアトミックがエイリアシングする場合の原子負荷の並べ替えは、これが一貫性の規則に違反する可能性があるため、一般的に排除される。 - エンドノート]
[intro.multithread]/26 [注:で定義されるようにC++プログラムのセマンティクスを保持しないことがあり潜在的に共有メモリロケーションの先読みを導入変換データレースを導入する可能性があるため、この規格を採用しています。ただし、データ競合のセマンティクスが明確な特定のマシンをターゲットとする最適化コンパイラのコンテキストでは、通常は有効です。レースに寛容ではない仮想マシンやハードウェアレースの検出には無効です。 - エンドノート]
文脈から、それは、「潜在的に共有メモリの場所が」「オプティマイザは、他のスレッドがアクセスする可能性を排除できないためにメモリ位置を意味することになっていることはかなり明らかだとそうする可能性があるとの悲観的な前提で進めるべきだ」と述べた。この2つのノートは、そのような前提の下で行われる場合とされない場合がある特定の最適化の合法性について議論します。
Re:グローバル変数。はい、グローバル変数は通常、任意のスレッドからアクセス可能です。原則として、プログラム全体の最適化を実行する洗練されたオプティマイザは、特定のグローバル変数が複数のスレッドから同時にアクセスされないことを証明することができるかもしれません(現存するコンパイラは現在認識されていませんfeat。しかし、私は自分自身をコンパイラーのエキスパートと呼んでいません)。グローバル変数が占めるメモリ位置は、オプティマイザによって潜在的に共有されるものとして扱われるべきである。
- 1. メモリと静的/共有ライブラリのプログラムの場所
- 2. 共有メモリのオーバーレイは何ですか?
- 3. meteor.jsを使用することの(潜在的な)短所は何ですか?
- 4. 共有場所にJavaオープンファイル
- 5. この潜在的なメモリリークの原因は何ですか?
- 6. 潜在的なPHPメモリの豚かどうか?
- 7. vb.netが共有潜水艦
- 8. マップベースの場所を共有する
- 9. オーバーラップする場所のハイパーリンク共有ツールチップ
- 10. 潜在的なヌルポインタアクセス。変数は、この場所ではnullになることがあります。 java.lang.NullPointerException
- 11. 配列が潜在的にNULLである場合の比較
- 12. 共有ライブラリを意図した最終的な場所とは別の場所からリンクする
- 13. DynamoDBで単一の定数ハッシュキーを使用する場合の潜在的な弱点は何ですか?
- 14. IcCube-共有フォルダ内のスナップショットの場所
- 15. CUDA共有メモリ割り当ての定数を宣言する場所
- 16. CSS3トリックを共有する場所
- 17. MPIで何らかの「共有メモリ」を再現する
- 18. GPU共有メモリの実用的な例
- 19. C++ WINAPI共有メモリの動的配列
- 20. 一時ファイルの共有場所
- 21. PHPのmail():注意すべき潜在的な問題は何ですか?
- 22. CUDA:中間共有メモリの場所へのポインタ予期しない動作
- 23. ネットワーク化されたVBA Driven excelブックを使用する場合の潜在的な課題は何ですか?
- 24. 共有データベース/メモリ
- 25. RDMAメモリ共有
- 26. は、潜在的に長いタスク
- 27. Linuxの共有メモリ
- 28. OpenCLの共有メモリ
- 29. 共有メモリでのバンクコンフリクトフリーアクセス
- 30. GPUでの共有メモリとL1キャッシュの違いは何ですか?
これを決定するのは実装次第です。実装が不可能であることが証明できない限り、何かが共有される可能性があります。 –
C++ 14では、似ているのは "潜在的に共有メモリの場所"です。 ** [intro.multithread] **の非規範的な注釈の両方で、2回現れます。特定の最適化の合法性を議論しているように、「他のスレッドがアクセスする可能性をオプティマイザが排除できないメモリ位置」を意味するように見えます。 –
@Igor Tandetnik質問が修正されました。ありがとうございます。 – mrn