뮤텍스를 2개생성하고 사용하는 예제

 

# MutexNoti Example


constexpr auto MAX_THR_CNT 4

 

DWORD WINAPI ThreadProc(PVOID pParam);



int main() 
{
     ① Mutex를 2개 생성 (종료Mutex, 임계구역설정Mutex)
     HANDLE arWaits[2];
     arWaits[0] = CreateMutex(nullptr, TRUE, _T("종료Mutex"));
     arWaits[1] = CreateMutex(nullptr, FALSE, _T("임계구역Mutex"));

    ② 작업 스레드를 생성  
    HANDLE arhThreads[MAX_THR_CNT];
    for(auto i=0; i<MAX_THR_CNT; i++)
    {
       DWORD dwThreadID(0);  
       arhThreads[i] = CreateThread(nullptr, 0, ThreaProc, arWaits, 0, &dwThreadID);
    }

    ③ 키를 받으면 실행중인 스레드를 종료하기 위해서 소유한 뮤텍스를 해제  
    getchar();
    ReleaseMutex(arWaits[0]);

    ④ 모든 스레드의 종료(TRUE)를 무한대기(INFINITE). 
    WaitForMultipleObjects(MAX_THR_CNT, arhThreads, TRUE, INFINITE);
 
    ⑤ 모든 스레드를 종료  
    for (auto i=0; i<MAX_THR_CNT; i++)
    {
        CloseHandle(arhThreads[i]);
    }

    for (auto i=0; i<2; i++)
    {
        CloseHandle(arWaits[1];
    }
    return 0;
}

* 스레드 엔트리 함수에 대한 구현
DWORD WINAPI ThreadProc(PVOID pParam)
{
     PHANDLE parWaits = (PHANDLE)pParam;

     while(true)
     {
          DWORD dwWaitCode = WaitForMultipleObjects(2, parWaits, FALSE, INFINITE);

          if(dwWaitCode == WAIT_FAILED)
          {  
              break;
          }

         if(dwWaitCode == WAIT_OBJECT_0)
         {
             break;
         }

         // Do somethings , Critical Region
         SYSTEMTIME st;
         GetLocalTime(&st);

         cout << "..." << "Sub Thread " << GetCurrentThreadId() << " => ";
         cout << st.wYear << "/" << st.wMonth << "/" << st.wDay << " ";
         cout << st.wHour << ":" << st.wMinute << ":" << st.wSecond << " ";
         cout << st.wMilliseconds << endl;

         ReleaseMutex(parWaits[1]);
         Sleep(1000);
     }
     return 0;
}

 

 

 

 

 

블로그 이미지

cocoa9518

,