コンピューティングにおいて、メモリ モデルは、メモリを介したスレッドの相互作用と、スレッドによるデータの共有使用を記述します。
メモリモデルは、コンパイラが多くの重要な最適化を実行できるようにします。ループ融合のようなコンパイラ最適化は、プログラム内のステートメントを移動しますが、これは共有変数の読み取りと書き込みの順序に影響を与える可能性があります。読み取りと書き込みの順序の変更は、競合状態を引き起こす可能性があります。メモリモデルがない場合、コンパイラはマルチスレッドプログラムにこのような最適化を全く適用しないか、マルチスレッドと互換性のない最適化を適用してバグを引き起こす可能性があります。
そのため、 Javaのような現代のプログラミング言語はメモリモデルを実装しています。メモリモデルは、同期ブロックやメソッドへの進入によるロックの取得など、明確に定義された特別な同期操作によって確立される同期バリアを規定しています。メモリモデルは、共有変数の値の変更は、そのような同期バリアに到達した場合にのみ他のスレッドに公開する必要があることを規定しています。さらに、競合状態の概念全体は、これらのメモリバリアに関する操作の順序に基づいて定義されています。[ 1 ]
これらのセマンティクスにより、最適化コンパイラは最適化を適用する際により高い自由度を得ることができます。コンパイラは、同期バリアにおける(潜在的に共有される)変数の値が、最適化されたコードと最適化されていないコードの両方で同じであることが保証されていることを確認するだけで済みます。特に、同期バリアを含まないコードブロック内のステートメントの順序変更は、コンパイラによって安全であると想定されます。
記憶モデルの分野におけるほとんどの研究は、次の点を中心に行われています。
Javaのメモリモデルは、一般的なプログラミング言語に包括的なスレッドメモリモデルを提供する最初の試みでした。[ 2 ]特定の制限を実装せずにスレッドをライブラリとして安全に実装できないこと、特にCおよびC++標準 ( C99およびC++03 ) に必要な制限が欠けていることが判明した後、[ 3 ] [ 4 ] C++ スレッド小委員会は、適切なメモリモデルの作業に着手しました。2005 年に、彼らは C 作業文書 n1131 [ 5 ]を提出し、C 委員会に作業への参加を求めました。提案されたメモリモデルの最終改訂版である C++ n2429 [ 6 ]は、2007 年 10 月の Kona での会議で C++ 草案標準に承認されました。[ 7 ]その後、メモリモデルは、次の C++ および C 標準であるC++11とC11に取り入れられました。[ 8 ] [ 9 [ 10 ]
Memory Modelは、マルチスレッドコードでどのような動作が許されるか、そしてスレッドがメモリを介してどのように相互作用するかを記述しています。プログラム内の変数間の関係と、実際のコンピュータシステムにおけるメモリやレジスタへの変数の格納と取得に関する低レベルの詳細を記述しています。これは、様々なハードウェアと様々なコンパイラ最適化を用いて正しく実装できる方法で記述されています。
C++のスレッドライブラリは、プログラム実行を指定するためにC++用の拡張メモリモデルを(暗黙的または明示的に)指定するという厄介な状況にあります。そこで、マルチスレッド実行に適したメモリモデルをC++標準に統合することを提案します。
この[リンクファーム]は、マルチスレッドC++プログラムの意味を明確にし、現在不足している標準的なスレッド関連APIを提供するための取り組みに関する情報を提供しています。
は、アトミックのメモリモデルをC++20からそのまま継承しているのが露骨です。