メモリモデル
C 抽象機械の目的のためにコンピュータのメモリ記憶域の意味論を定義します。
C のプログラムに利用可能なデータ記憶域 (メモリ) は1つ以上の連続するバイトの並びです。 メモリ内のそれぞれのバイトには一意なアドレスがあります。
バイト
バイトはメモリのアドレス可能な最小の単位です。 基本実行文字集合 (シングルバイトであることが要求される96個の文字) の任意のメンバを保持するのに十分な大きさの、連続するビットの並びとして定義されます。 C は8ビット以上のサイズのバイトをサポートします。
char、 unsigned char、および signed char 型は記憶域と値表現の両方に1バイトを使用します。 1バイトのビット数は CHAR_BIT としてアクセスできます。
他の基本の値を表現するためのバイトの使用方法 (ビッグエンディアンおよびリトルエンディアンメモリレイアウトを含みます) については、オブジェクト表現を参照してください。
メモリ位置
メモリ位置は以下のいずれかです。
struct S {
char a; // メモリ位置 #1
int b : 5; // メモリ位置 #2
int c : 11, // メモリ位置 #2 (続き)
: 0,
d : 8; // メモリ位置 #3
struct {
int ee : 8; // メモリ位置 #4
} e;
} obj; // オブジェクト obj は4つの別々のメモリ位置から構成されます。
スレッドとデータ競合実行のスレッドは thrd_create または他の方法によるトップレベル関数の起動によって開始される、プログラム内の制御の流れです。 いかなるスレッドもプログラム内のあらゆるオブジェクトに潜在的にアクセスできます (自動およびスレッドローカル記憶遺棄期間を持つオブジェクトもポインタを通して別のスレッドからアクセスされるかもしれません)。 異なる実行のスレッドは異なるメモリ位置に相互作用や同期要件なしで並行的にアクセス (読み込みおよび変更) することが許されます (同じ構造体内の2つの非アトミックなビットフィールドを並行的に更新することは、それらのビットフィールド間で宣言されたすべてのメンバも (非ゼロな長さの) ビットフィールドであれば、間のビットフィールドのサイズがどうであったとしても、安全ではないことに注意してください)。 ある式の評価があるメモリ位置に書き込み、別の評価が同じメモリ位置を読み込むか変更するとき、それらの式は衝突すると言います。 2つの衝突する評価を持つプログラムは、以下のいずれかの場合を除いて、データ競合を持ちます。
データ競合が発生する場合、プログラムの動作は未定義です。 (特に、 mtx_unlock は、別のスレッドによる同じミューテックスの mtx_lock に対して同期し、それゆえ先行発生します。 これによりデータ競合に対して保護するためにミューテックスのロックを使用することが可能になります。)
メモリ順序あるスレッドがあるメモリ位置から値を読み込むとき、それは初期値を見るかもしれませんし、同じスレッドによって書き込まれた値を見るかもしれませんし、別のスレッドによって書き込まれた値を見るかもしれません。 スレッドによって行われた書き込みが他のスレッドに可視となる順序の詳細は memory_order を参照してください。 |
(C11以上) |
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 3.6 byte (p: 4)
- 3.14 memory location (p: 5)
- 5.1.2.4 Multi-threaded executions and data races (p: 17-21)
- C99 standard (ISO/IEC 9899:1999):
- 3.6 byte (p: 4)
- C89/C90 standard (ISO/IEC 9899:1990):
- 1.6 DEFINITIONS OF TERMS
関連項目
メモリモデル の C++リファレンス
|