우선 Synchronization, 동기화의 의미에 대해 좀 살펴봐야 겠는데,
일단 동기화 라고 하는 것은 멀티스레드와 관련이 있는 단어다. 즉 싱글스레드에서는 동기화라고 하는 개념은 없다고 생각하자.
그럼 멀티스레드에서 동기화가 의미하는 바는, 어떤 코드의 구역이 여러 스레드에 의해 동시에 실행되지 않도록 하는 것이라 할 수 있다.
특정 변수에 동시에 접근하지 않도록 하는 것이 동기화 아니냐고 반문할 수도 있겠지만, 결국 특정 변수에 접근한다는 말 자체가 어떤 코드의 실행을 의미하기 때문에, 좀더 일반적인 설명은 특정 코드의 구역에 대한 동시 실행을 막는다는 것이 좋을 듯 하다.
위의 동기화 구현은 보통 Lock이라는 요소를 등장시켜 구현한다. 닷넷의 Monitor나 자바의 synchronized 키워드 같은 것들이 다 Lock 개념을 이용한 동기화 구현체다.
누구나 알고 있는 너무 당연한 이야기를 장황하게 언급한 이유는,
SynchronizationContext 가 추구하는 동기화와 차이가 있기 때문이다.
위에서 이야기한 동기화에서는, Lock으로 묶이는 코드의 구역이 어떤 Thread에 종속되는 것은 아니다.
즉 여러 Thread가 동시에 실행되지 못하게 할 뿐이지, 특정 Thread만 그 코드를 실행할 수 있도록 하는 것은 아니라는 말이다.
그런데 만약, 이렇게 동시에 실행되면 안되는 코드의 구역이 여러 곳에 분산되어 아주 많아지는 경우라면 어떤가?
일일이 코드가 동시에 실행되면 안되는지 분석하고, 그 곳을 항상 Lock으로 묶어야 한다. 코드가 점점 커짐에 따라 상황은 점점 복잡해지고 악화되고 버그도 함께 증가할 것이다. 특히 멀티스레드의 버그는 잡기 어렵기로 유명하다.
뭔가 다른 대책이 필요하다.
그럼 이렇게 생각해 보자. 차라리 어떤 코드 혹은 객체를 특정 Thread와 묶어 버리는 것이다. 즉 특정 코드 혹은 객체는 항상 특정 Thread만 실행할 수 있도록 하자는 것이다. 이렇게 정하고 나면, 여러 Thread가 동시에 코드 혹은 객체를 접근하지 않는다는 보장이 생기기 때문에, 멀티스레드에 대한 고려를 생각하지 않아도 된다.
코드 혹은 객체를 프로그래밍할 때도, 코드가 실행되는 시작부분(보통 함수나 메소드의 시작부분)에서만 자신을 실행하려고 하는 Thread가 자신이 소속된 Thread인지 검사하는 코드를 넣어주면 되기 때문에, 복잡한 코드의 분석이나 Lock으로 묶어야 하는 부분을 찾지 않아도 된다. 따라서 버그도 줄어들게 된다.
이것은 COM에서 STA(Single-Threaded Apartment)와 같은 개념이다.
이렇게 하면 결국 한가지 문제만 해결하면 된다. 다른 Thread에서 그 코드 혹은 객체에 접근하는 방법말이다.
예상하겠지만, 이를 위한 도구가 바로 SynchronizationContext 다.
어떤 Thread에 종속된 객체를 접근하고 싶으면, 그 객체가 소속된 Thread의 SynchronizationContext 를 얻어 와서 SynchronizationContext.Post 혹은 SynchronizationContext.Send 를 사용하면 된다.
그러면 Post 혹은 Send 에 넣어준 delegate를 해당 Thread에서 실행되도록 해 준다.
일반적으로 이렇게 객체와 Thread를 커플링 시키는 경우는 대부분이 GUI 관련 객체들이다. GUI 관련 객체들은 그 객체를 생성한 Thread와 종속되고, 그 GUI 관련 객체의 조작은 항상 그 객체를 생성한 Thread를 통하도록 되어 있다.
닷넷에는 2개의 GUI 관련 프레엠워크가 있는데, WinForm 과 WPF 다.
그리고 이 WinForm 과 WPF 를 위한 SynchronizationContext 가 있는데,
System.Windows.Forms.WindowsFormsSynchronizationContext 와
System.Windows.Threading.DispatcherSynchronizationContext 다.
둘다 System.Threading.SynchronizationContext 를 상속 받았다.
다음 글에서 좀더 이 3개의 클래스에 대해 좀더 자세히 살펴보자.
[출처] SynchronizationContext 가 추구하는 동기화|작성자 쫌조
'Programming > C#' 카테고리의 다른 글
C# Using PostMessage (0) | 2015.03.29 |
---|---|
Random Class (0) | 2015.02.08 |
SynchronizationContext 가 추구하는 동기화 #2 (0) | 2015.02.07 |
AppDomain 프로그래밍에 대한 이야기 (0) | 2015.02.05 |
How to: Determine Which .NET Framework Versions Are Installed (0) | 2015.02.05 |