Dirty Read

홈 > 공유팁! > 프로그램 관련
프로그램 관련

Dirty Read

꽁스짱 0 847
하나의 쓰레드가 파일에 쓰고 있는 중에 다른 쓰레드가 그 데이타를 읽게 된다면, 읽는 쪽에서는 완전한 데이타를 읽기 못할 수 있다. 흔히 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))
    {
        // 100 바이트 먼저 쓰고
        Console.WriteLine("First write : 100 bytes");
        fs.Write(bytes, 0, 100);   
        
        // 3초후 나머지 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()
{
    // Write가 먼저 파일핸들 획득하도록 잠시 대기. 
    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); 
}
 
0 Comments
제목