2012. 11. 6. 23:24

Thread Safe & InvalidOperationException

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안녕하세요 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