2011-07-21 8 views
0

私は複数のスレッドから読み込まれるファイルを持っていますが、それぞれのシークと読み込みをクリティカルセクションに入れる必要がありますか?私は避けるようにしようとしているものを明らかにマルチスレッドファイルの読み込み、シーク&リードにクリティカルセクションが必要ですか?

stream.Seek(seekStart, SeekOrigin.Begin); 
stream.Read(); 
stream.Seek(seekNext, SeekOrigin.Current); 
stream.Read(); 

または

lock(fileLock) 
{ 
    stream.Seek(seekStart, SeekOrigin.Begin); 
    stream.Read(); 
    stream.Seek(seekNext, SeekOrigin.Current); 
    stream.Read(); 
} 

次のような状況です。

. 
. 
Thread A: Seek 
<- Preempted -> 
Thread B: Seek 
Thread B: Read 
<- Preempted -> 
Thread A: Read (Will this be reading from the wrong location?) 
. 
. 

答えて

3

あなたのストリームは別のスレッドで別々のオブジェクトになりますので、[OK]をする必要があります重要ではない。各ストリームは、それぞれのシーク位置を保持する必要があります。したがって、他のストリームと干渉しないようにしてください。

これは、クラスオブジェクト内のあなたのすべての変数を宣言すると、静的されていないことを前提としています。

0

それはあなたが求めてそれぞれに必要とクリティカルセクションにあるように読んでいました同じストリームであれば...

またあなたは、これは複数のスレッドを可能に... MemoryMappedFile(.NET 4でNE)を使用することができます

+0

私は3.5になっていますので、ある時点でinteropをメモリマップに使用していますが、まだありません – tbridge

+0

ファイルの大きさはどれくらいですか?あなたはそれをバイト[]にロードして、その配列から別のスレッドから並列に読み出すこともできます – Yahia

+0

メモリ全体をロードしたくないです。 – tbridge

1

あなたがスレッド間で共有されているオブジェクトを変更しているときはいつでも、それはRAMにファイルをマッピングし、その後、あなたはそのコンテンツのランダムアクセスをすることができるのでcrisitcalセクションせずにアクセスするには...、あなたはクリティカルセクションを必要としています。 stream変数が(同じオブジェクトを参照)共有されている場合

、[はい。

各スレッドが独自stream変数を持っている場合(同じオブジェクトを参照しない)、次いでありません。

0

MSDNは、FileStreamオブジェクトはその ハンドルを排他的に保留を持っていない場合は、別のスレッドが同時にファイルハンドルにアクセスして そのオペレーティングシステムのファイルポインタの位置を変えることができる「のFileStreamため

を言いますこの場合、FileStreamオブジェクト のキャッシュされた位置と、バッファ内のキャッシュされたデータは、 になります。FileStreamオブジェクトは、キャッシュされたバッファにアクセスするメソッドを定期的にチェックして、操作中 システムのハンドル位置は、FileStreamオブジェクト によって使用されるキャッシュされた位置と同じです。

Readメソッドへの呼び出しでハンドル位置が予期しない変化を検出した場合、.NET Frameworkは バッファの内容を破棄し、ファイルからストリームを再度読み取ります。これは、ファイルのサイズやファイルストリームの位置に影響を与える可能性があり、他のプロセス に応じて、 パフォーマンスに影響を与えることができます。

だから、少なくとも、あなたはパフォーマンスの問題を持つことができます。パフォーマンスのために、非同期I/O(BeginRead、EndRead)を使用するのが最適な解決策です。

関連する問題