より具体的には、私は以下を(簡略化して)持っています:
union foo
{
volatile int bits;
char data[sizeof(int)*CHAR_BIT];
}
sizeof(int)
の最初の項目にアクセスしたことがない場合、期待どおりに機能data
することに頼ることはできbits
ますか?
基本的に、構造体のフィールドの1つを揮発性としてマークするのは正しいことです。ただし、volatileキーワードの機能を覚えておく必要があります。変数へのアクセスを最適化しないようにコンパイラーに指示します。値は、レジスタ内のコピーからではなく、常にメモリから読み取られます。
コメントを書くとき、あなたはメモリ割り当てスレッドを安全にしようとしています。残念ながら、volatileは、複数のスレッドからアクセスできることを保証するものではありません。8ビットCPUを使用している場合、整数値へのアクセスは不可分操作ではないため、プログラムは正しく機能しません。
volatile
ロックの実装にはまったく役立ちません。私は理論的に話しているだけではありません。シングルCPU/シングルコア環境でも失敗し、競合状態になります。実際のアトミックロッキングプリミティブを作成する唯一の方法は、CPUのロッキングプリミティブ(x86の場合はロックプレフィックス)を使用してアセンブリを作成することです。
実際には、それでうまくいく方法があるかもしれませんが、volatile
私が知っている唯一のそのようなロックメカニズムは、スレッドの数であるO(n)
スペースを取ります。n
これは、可能なスレッドの数が事前にわからない場合、かなり役に立たないものになります。