하나의 쓰레드가 파일에 쓰고 있는 중에 다른 쓰레드가 그 데이타를 읽게 된다면, 읽는 쪽에서는 완전한 데이타를 읽기 못할 수 있다. 흔히 DB에서 완전히 Commit되지 않은 데이타를 읽으려 할 때 이를 Dirty Read라 부른다. 파일시스템에서도 이러한 Dirty Read가 가능한데, 다음 예제는 2개의 쓰레드가 서로 FileShare.ReadWrite 공유를 하면서 한 파일을 동시에 읽고 쓰는 코드이다. 여기서 쓰기 쓰레드는 200 바이트를 쓰지만, 읽기 쓰레드는 쓰기가 채 마치기 전에 읽기를 끝내기 때문에 100 바이트만 읽게된다.
예제
static void Main()
{
Thread t1 = new Thread(Writing);
Thread t2 = new Thread(Reading);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
}
static void Writing()
{
var bytes = new byte[200];
for (int i = 0; i < 200; i++)
{
bytes[i] = 55;
}
long bytesWritten = 0;
using (var fs = File.Open(fileName, FileMode.Open, FileAccess.Write, FileShare.ReadWrite))
{
Console.WriteLine("First write : 100 bytes");
fs.Write(bytes, 0, 100);
Thread.Sleep(3 * 1000);
Console.WriteLine("Second write: 100 bytes");
fs.Write(bytes, 100, 100);
bytesWritten = fs.Length;
}
Console.WriteLine("Total writing: {0} bytes", bytesWritten);
}
static void Reading()
{
Thread.Sleep(1000);
byte[] bytes;
long bytesRead = 0;
using (var fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
Console.WriteLine("Reading data...");
bytes = new byte[fs.Length];
fs.Read(bytes, 0, (int)fs.Length);
bytesRead = fs.Length;
}
Console.WriteLine("Total reading: {0} bytes", bytesRead);
}