Where The Streets Have No Name

멀티쓰레드 프로그래밍 - Critical_Section 을 간편하게 사용 본문

Developement/C, C++, C#

멀티쓰레드 프로그래밍 - Critical_Section 을 간편하게 사용

highheat 2008. 5. 13. 01:16
출처 : http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8071&ref=8071

멀티쓰레드 프로그래밍을 할때면 항상 고민하는 부분이 있습니다.

또한 만약 락이 발생하면 디버깅도 쉽지 않죠.

쓰레드간 공유하는 변수들을 아래에 있는 클래스로 변수입출력을 담당하게 해주면

이러한 고민에서 조금은 해결할수 있습니다.

다음은 foobar2000 소스에 있는 좋은 클래스를 소개합니다.

실제로 얼마전에 저는 쓰레드 13개가 동작하는 멀티쓰레드 프로그래밍을 짜면서

유용하게 써먹었습니다^^

===========================================================================

 

class critical_section

{

private:

       CRITICAL_SECTION sec;

       int count;

public:

       int enter() {EnterCriticalSection(&sec);return ++count;}

       int leave() {int rv = --count;LeaveCriticalSection(&sec);return rv;}

       int get_lock_count() {return count;}

       int get_lock_count_check() {enter();return leave();}

       inline void assert_locked() { ASSERT(get_lock_count_check()>0); }

       inline void assert_not_locked() { ASSERT(get_lock_count_check()==0); }

       critical_section() {InitializeCriticalSection(&sec);count=0;}

       ~critical_section() {DeleteCriticalSection(&sec);}

#ifdef CRITICAL_SECTION_HAVE_TRYENTER

       bool try_enter() {return !!TryEnterCriticalSection(&sec);}

#endif

};

 

class c_insync

{

private:

       critical_section * ptr;

public:

       c_insync(critical_section * p) {ptr=p;ptr->enter();}

       c_insync(critical_section & p) {ptr=&p;ptr->enter();}

       ~c_insync() {ptr->leave();}

};

 

#define insync(X) c_insync blah____sync(X)

 

 

=============================================================

사용하고자 하는 클래스 에서

아래와 같이 선언하고, 멤버중 Set/Get 메서드에서 매크로만 호출하면 됨.

 

///  예제)

 

class aa

{

      int a;

     void SetA(int n) { insync(m_sync); a=n; }

     int GetA() { insync(m_sync); return a; }

 

      critical_section m_sync;

};

  

멀티쓰레드에서 이제 락문제 말끔히 해결^^

항상 눈팅으로 정보만 주워가다가 하나 올려봅니다^^