VB.NET 2008/Visual Basic 2008

스레딩 - 스레드 동기화

본클라쓰 2011. 6. 18. 10:59

 

응용 프로그램에서 다중 스레드를 사용할 때의 이점 중 하나는 각 스레드가 비동기적으로 실행된다는 점입니다. Windows 응용 프로그램의 경우 이렇게 하면 응용 프로그램 창과 컨트롤의 응답 가능 상태를 유지한 채 시간이 오래 걸리는 작업을 백그라운드에서 수행할 수 있습니다. 서버 응용 프로그램의 경우 다중 스레딩을 사용하면 들어오는 각 요청을 서로 다른 스레드로 처리할 수 있습니다. 그렇지 않으면 이전 요청이 완전히 처리될 때까지 새로운 각 요청의 처리를 시작할 수 없습니다.

 

그러나 스레드의 비동기적 특성으로 인해 파일 핸들, 네트워크 연결, 메모리 등과 같은 리소스에 대한 액세스를 조정해야 한다는 문제가 있습니다. 그렇지 않으면 두 개 이상의 스레등에서 각각 다른 스레드의 작업을 인식하지 못한 채 동시에 리소스에 액세스할 수 있습니다. 그 결과로 예기치 않은 데이터 손상이 발생할 수 있습니다.

 

 

 

lock(C#) 및 SyncLock(Visual Basic) 문을 사용한 동기화

 

lock(C#) 및 SyncLock(Visual Basic) 문을 사용하면 다른 스레드의 방해를 받지 않은 채 코드 블록의 실행을 완료할 수 있습니다. 이를 위해서는 코드 블록을 진행하는 동안 지정된 개체에 대한 상호 배타적 잠금을 유지해야 합니다.

 

Dim lockThis As Object

 

SyncLock lockThis

    ' Access thread-sensitive resource.

End SyncLock

 

lock 키워드에 제공되는 인수는 참조 형식을 기반으로 한 개체여야 하고 이 개체는 잠금 범위를 정의하는 데 사용됩니다.

 

 

 

 

Monitor 키워드를 사용한 동기화

 

Monitor를 사용하면 코드 블록이 여러 스레드에서 동시에 실행되지 않도록 방지할 수 있습니다. Enter 메서드를 사용하면 스레드 하나만 다음 문으로 진행되도록 허용 할 수 있습니다. 다른 모든 스레드는 현재 실행 중인 스레드가 Exit를 호출할 때까지 차단됩니다.

Dim obj As Object = CType(x, Object)

 

System.Threading.Monitor.Enter(obj)

 

Try

    DoSomething()

Finally

    System.Threading.Monitor.Exit(obj)

End Try

 

일반적으로 Monitor 클래스를 직접 사용하는 것보다 lock(C#) 또는 SyncLock(Visual Basic) 키워드를 사용하는 것이 더 좋습니다. Lock or SyncLock 키워드를 사용하면 코드를 더 간결하게 작성할 수 있고 lock 또는 SyncLock 키워드의 경우 보호된 코드에서 예외를 Throw 하더라도 내부 모니터를 해제할 수 있기 때문입니다. 이를 수행하는 데는 finally 키워드가 사용됩니다. 이 키워드는 예외가 throw되었는지 여부와 상관없이 관련 코드 블록을 실행합니다.