응용 프로그램에서 다중 스레드를 사용할 때의 이점 중 하나는 각 스레드가 비동기적으로 실행된다는 점입니다. 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되었는지 여부와 상관없이 관련 코드 블록을 실행합니다.
'VB.NET 2008 > Visual Basic 2008' 카테고리의 다른 글
마우스 커서의 모양 변경 (0) | 2012.05.30 |
---|---|
HashTable의 키 기준 정렬 (0) | 2012.05.29 |
스레딩 - 다중 스레딩 (0) | 2011.06.18 |
어셈블리 - 클래스 라이브러리(.dll) 생성 및 사용방법 (0) | 2011.06.15 |
어셈블리 - Visual Basic에서 Windows API 사용 (0) | 2011.06.15 |