Thread Safe & InvalidOperationException
안녕하세요 Geeks_Company 입니다.
최근 Picasa uploader 를 만들면서 Multi-Thread 를 사용하게 되었는데요.
이번 기회에 제가 아는 선에서 정리를 좀 해 볼까 합니다.
(틀릴 경우 추후 수정 처리 하겠습니다. )
핵심 내용은 이러 합니다.
- Thread는 가볍지 않다(windows 환경에서는 1M가 차지)
- Thread 가 많을수록 Switch Context 가 Process의 수행 속도에 영향을 끼친다.
- Windows에서 Thread 는 그 어떤 Thread에 의해서 침범 당할 수 없다.
- ThreadPool -> SmartThreadPool 사용은 필연적이다.
일단 제가 알기로는 Thread 는 Process의 특정 영역을 공유 하는 방식이며,
구현(ASM)은 Process의 특정 Address에 있는 Atomic 수준의 Multi-Executing 정도로 압니다.
Thread 는 가벼움을 장점으로 Process의 특정 수행을 독립적으로 실행하는 매력이 있습니다.
이러한 Thread가 Debugging 을 지원 하면서부터 슬슬 무거워지기 시작한걸로 압니다.
Debugging 시 해당 thread의 간략한 모든 정보를 저장해야 하며, Breakpoint 를 집어 넣어서 처리 해야 되는데,
OS입장에서 Thread debugging 이나, Process Debugging 이나 크게 달라 보이진 않을꺼 같습니다.
이러한 Manage 기능 추가는 반드시 비용이 발생되며, 그 영향은 덩치 & 수행속도와의 Trade off 지점이 아닌가 싶습니다.
윈도우 개발 환경에서 Thread 불문율은 다른 Thread가 내 Resource 를 침범 할수 없다 입니다.
이 법칙은 UI 쪽에서는 특히 유효 합니다.
제목의 InvalidOperationException , Cross Thread 이런 문제는 모두, Main Thread 가 관장하는 Control 을 다른 Thread가
Resource 변경 시 발생되며, 이러한걸 지칭하는 것이 Thread Safe 이냐 아니냐 하는 것 입니다.
http://www.codeproject.com/Articles/37642/Avoiding-InvokeRequired
잘정리한 링크 인데요.
이곳에서 this는 Main thread를 가리키며, 주로 컨트롤입니다.
여기서 잘 파악해야 하는 개념은 InvoRequired 인데요.
해당 주석은 이러 합니다.
즉, UI에서 Control을 만든 Main Thread가 호출 하냐, 아니냐를 구분 처리 하는겁니다.
제가 많이 본 소스 코드는 Required 가 true일 경우 다시 Delegate을 Invoke 시키는 건데요.
Delegate 은 thread Safe이므로, 저렇게 처리 할 경우 호출한 main thread로 처리 될 기회가 더 많이 지려니 합니다.
그 후 해당 main thread가 자식 Control의 Resource 를 접근 가능하게 됩니다.
그외에 별도로, UI 작업을 하다 보면 frozen 현상을 겪게 되는데요.
제 추측에는 main thread 가 UI 쪽 보다 특정 로직에 우선 순위를 부여 하게 될경우(while, for)를 Frozen 으로 인식하는 것 같습니다.
이러한 증상을 없애기 특정 로직을 부분별로 짤라서 Multi-thread로 처리 하면 됩니다.
만약 위와 같은 경우의 소스 코드라면, 배보다 배꼽이 더 커지는 현상을 경험 하실수 있습니다.
이럴 경우, ThreadPool을 작성 해서 처리 해야 되는데요.
ThreadPool은 Thread 생성시 생기는 오버헤드를 줄이고, Idle Thread를 재 사용 하기 위한 패턴인데요.
http://en.wikipedia.org/wiki/Thread_pool_pattern
대략 개념은 이곳을 통해서 잡으시면 됩니다. 자세히 설명한 링크는 찾을수 없지만,
제가 언급한 문제점에 관한 것 역시 볼수 있습니다.
그럼 ThreadPool 을 사용 할 경우 이 ThreadPool의 Thread 개수가 job에 맞는 최적화된 개수이냐? 란 질문을 다시하게 됩니다.
즉 ThreadPool의 1차 고도화 작업 정도로 보시면 됩니다
요런 부분을 해결하기 위해서 Smart Thread Pool 이란게 나온건데요.
요 그래프를 보면, Pool에 2개의 Thread가 있으며, 사용된게 1개란게 나옵니다.
즉, 추후 처리 할 업무에 맞게 Thread를 생성 한다 정도로 보시면 됩니다.
대략 Thread 관련되서 생각을 정리 한듯 해서 이만 적겠습니다.
감사 합니다.
'관련자료' 카테고리의 다른 글
Graphviz를 사용해 봤습니다. (0) | 2014.02.08 |
---|---|
PK/FK 관련 (0) | 2012.11.26 |
Geeks_Auto_Capture (0) | 2012.11.03 |
스크린 캡쳐 관련되서. (0) | 2012.11.01 |
Picasa Uploader 중복 사진 제거 (0) | 2012.10.31 |