2011-07-21 32 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

因爲你流將在單獨的線程單獨的對象,你應該確定沒有把它變得關鍵。每個流都應該擁有自己的查找位置,因此不應該干擾其他流。

這假設你是在類對象中聲明所有的變量,而不是靜態的。

0

如果你需要爲每個搜尋和讀取是在一個關鍵的部分相同的流...

或者您可以使用MemoryMappedFile(在.NET 4 NE)......這允許多個線程因爲它映射文件到RAM中,然後你可以隨機訪問其內容...

+0

我在3.5,所以我可以使用互操作在某些點上的內存映射,但還沒有 – tbridge

+0

文件有多大?你甚至可以將它加載到一個字節[]中,並從不同的線程並行讀取數組 – Yahia

+0

我不想將整個東西加載到內存中,否則是的,那個owuld是很好的 – tbridge

1

每當你修改這是跨線程共享一個對象,你需要一個關鍵節來訪問它沒有crisitcal部分。

如果stream變量被共享(指向同一個對象),那麼是的。

如果每個線程有其自己的stream變量(未指相同的對象),則沒有。

0

MSDN說對的FileStream」

當FileStream對象不具有排他性保持其 手柄,另一個線程可以訪問該文件同時處理和 改變操作系統的文件指針的位置是與文件句柄關聯的 在這種情況下,FileStream對象中的高速緩存位置和緩衝區中的高速緩存數據可能是 受損.FileStream對象通常對訪問高速緩存的緩衝區的方法執行檢查,以確保經營 系統的句柄位置與FileStream對象 使用的緩存位置相同。

如果在對Read方法的呼叫 中檢測到句柄位置發生意外更改,則.NET Framework會丟棄緩衝區中的內容並再次從該文件讀取該流。這可能會影響 的性能,具體取決於文件大小以及可能影響文件流位置的任何其他進程 。

那麼至少,你可以有性能問題。對於性能,最好的解決方案是使用異步I/O(BeginRead,EndRead)