5

最近、 volatile の使用について質問したところ、メモリ バリアとその使用法について議論しているインテルやその他の非常に有益な記事を読むように指示されました。これらの記事を読んだ後、私はかなり妄想的になりました.

私は64ビットマシンを持っています。複数のスレッドからメモリの隣接する重複しない領域に memcpy するのは安全ですか? たとえば、バッファがあるとします。

char buff[10];

あるスレッドが最初の 5 バイトに memcpy し、2 番目のスレッドが最後の 5 バイトにコピーすることは常に安全ですか?

私の腸の反応 (およびいくつかの簡単なテスト) は、これが完全に安全であることを示していますが、完全に納得できる文書をどこにも見つけることができませんでした.

4

4 に答える 4

7

安全です、はい。少なくとも、この限定された例ではパフォーマンスが向上します。1 つのキャッシュ ラインを 2 つのコアで同時に使用することはできないことに注意してください。コア B がバッファに書き込む間、コア A を強制的に待機させ、メモリが転送されるまで待機させてから書き込みます。この影響を回避するには、マルチコア メモリ コピーのサイズを非常に大きくする必要があります。

于 2011-01-14T19:58:35.733 に答える
4

はい、完全に安全です。メモリ バスへのアクセスのシリアル化はハードウェアで行われます。

于 2011-01-14T19:50:53.260 に答える
2

memcpy の各インスタンスが、バッファーのその部分のみに書き込みを行っていると認識している限り、完全に安全です。C++ での任意の形式の配列割り当ては、非常に低レベルです。これは、プログラムに適切なサイズで割り当てられたストレージの連続したブロックであり、ポインタ以外のものとして存在するオブジェクトとしての配列は単なる幻想です。memcpy に配列の重複しない範囲を指定すると、それらがたまたま隣接している 2 つの完全に別個の配列ではないことを知る方法がありません。書き込みは干渉しません。

于 2011-01-14T19:50:49.293 に答える
0

はい、これは注文前のあらゆる種類の出来事とはまったく関係ありません。バイトをコピーするだけです。

于 2011-01-14T20:00:25.190 に答える