2

私は次のCコードを持っています:

...
data[index] = something;
a_write_memory_barrier();
index = new_index;
...

コードはロックによって保護されていません(他の人はただ読んdataで)、の更新前に保存されindexていることを確認したいと思います。このコードの周りには他の変数のメモリ書き込みと読み取りがありますが、それらは重要ではないので、GCCはそれらを自由に並べ替えることができます(最適化のためにそうすることを願っています)。の順序を保証するだけで十分です。この目標を達成するには、どのように実装する必要がありますか?data[index]indexdata[index]indexa_write_memory_barrier()

4

1 に答える 1

1

アウトオブオーダー実行(おそらく分散フレームワークで作業する)を気にする必要がある場合は、もちろん、アーキテクチャがTSO(トータルストアオーダー)をサポートしている場合は、ロードロード、ストアストア、および完全なバリアを考慮する必要があります。ストアバリアを気にしないでください。書き込み操作は、コードに記述されているようにシーケンシャルになります。

一方、コンパイラの並べ替えが心配な場合は、Volatile(google it)の使用を検討してください。

あなたの例のストアバリアはあなたの問題を解決します、そのようなバリアの実装はあなたが使うアーキテクチャとコンパイラに依存します:

例えば

sparcおよびgccコンパイラの場合:

   #define MEMBAR_STORESTORE()  asm volatile ("membar #StoreStore":::"memory")
于 2012-11-04T07:22:58.067 に答える