多线程文件读取,确实寻求&阅读需要关键部分?

时间:2011-07-21 19:17:12

标签: c# multithreading file-io

我有一个可以从多个线程读取的文件,我是否需要将每个搜索和读取放入一个关键部分?

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?)
.
.

4 个答案:

答案 0 :(得分:3)

因为你的流将是不同线程中的独立对象,所以你应该没有关键。每个流应该拥有自己的搜索位置,因此不应该干扰其他流。

这假定您在类对象中声明所有变量,而不是静态。

答案 1 :(得分:1)

每当你修改一个跨线程共享的对象时,你需要一个关键部分。

如果正在共享stream变量(指同一个对象),那么是。

如果每个线程都有自己的stream变量(不是指同一个对象),那么没有。

答案 2 :(得分:0)

如果它是每个搜索所需的相同流,并且读取在关键部分...

或者你可以使用MemoryMappedFile(在.NET 4中的ne)...这允许多个线程访问它而没有crisitcal部分,因为它将文件映射到RAM然后你可以随机访问它的内容......

答案 3 :(得分:0)

MSDN对FileStream说“

  

当FileStream对象没有对其进行独占保留时   handle,另一个线程可以同时访问文件句柄   更改操作系统的文件指针的位置   与文件句柄相关联。在这种情况下,缓存位置   FileStream对象和缓冲区中的缓存数据可以是   损害。 FileStream对象通常执行检查   访问缓存缓冲区以确保操作的方法   系统的句柄位置与使用的缓存位置相同   FileStream对象。

     

如果在通话中检测到手柄位置发生意外更改   对于Read方法,.NET Framework会丢弃该内容   缓冲并再次从文件中读取流。这可能会影响   性能,取决于文件的大小和任何其他进程   这可能会影响文件流的位置。

至少,你可能会遇到性能问题。为了提高性能,最好的解决方案是使用异步I / O(BeginRead,EndRead)