我有一个可以从多个线程读取的文件,我是否需要将每个搜索和读取放入一个关键部分?
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?)
.
.
答案 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)