13

メモリ マップド ファイルの名前が示すようにMemoryMappedFile、C# のクラスを使用して大きなファイルの一部をメモリにマップし、データ処理を高速化できることを理解しています。メモリ マップ ファイルでやりたいことは、メモリ マップを並列処理することです。そのために、次の質問があります

  1. MemoryMappedFileViewAccessorスレッドセーフで Parallel.For-safe ですか? 実際に質問をテストするデモ プログラムを作成しましたが、動作しているようです。しかし、これに関する参考文献が見つかりません。答えが「はい」の場合、完了です。さもないと、
  2. 配列にマップされたメモリに直接アクセスする方法はありますか? MemoryMappedFileViewAccessorReadArray メソッドがあることは知っていますが、メソッドを使用するとメモリが複製されます。
4

3 に答える 3

12

これを推論できます。メモリ マップド ファイルは、複数のプロセスからバイトにアクセスできる、プログラム内の単なるメモリのチャンクです。このチャンクは特定のアドレスに存在するため、マネージ コードではかなり厄介です。ポインターを使用してデータにアクセスする必要があるため、マネージド コードではタブーです。MemoryMappedFileViewAccessor はそのポインターをラップし、マネージ メモリから共有メモリにデータをコピーします。これは、MMF を使用する主な理由と、それらのサポートが .NET に現れるまでに長い時間がかかった理由に反することに注意してください。代わりに名前付きパイプを使用しないようにしてください。

したがって、これを推論すると、グローバル変数がコード内にあるのと同じように、これは共有メモリであるため、MMF は設計上スレッドセーフではありません。スレッドが共有メモリの同じセクションを読み書きすると、まったく同じように問題が発生します。また、1 つのスレッドだけが共有セクションにアクセスできるようにするためのロックも、まったく同じように保護する必要があります。

また、MMF を読み書きするプロセス間でそのロックを実装する必要があることにも注意してください。「マスター」プロセスが作成し、「スレーブ」プロセスが開く名前付きミューテックスを使用する必要があります。そのロック要件を軽視することはできません。注目すべきは、質問でこれを処理することについて言及したことがないため、赤旗です。

1 つのプロセス内で、MMF の同じセクションにアクセスしないスレッドは、相互にアクセスできません。異なる変数にアクセスする 2 つのスレッドが同期を必要としないのと同じように。別のプロセスがセクションに書き込むことができないことを保証するミューテックスを保持している限り。これはおそらく、セマフォを使用して MMF アクセスを保護することを意味することに注意してください。Mutex は 1 つのスレッドによってのみ取得できます。

于 2013-05-03T22:32:54.977 に答える