[C++] Mutex

홈페이지를 이전하며 2012년 5월 2일 작성했던 글을 가져와 수정한 것입니다.

멀티 스레드를 사용할 때 스레드의 순서를 제어하거나 하고싶을 때가 있습니다. 이럴 때 사용할 수 있는 방법은 여러가지가 있지만 그 중 Mutex에 대해 소개하겠습니다.

먼저 아래 코드를 보시죠.

 

  1. unsigned __stdcall FirstThread(void *arg);
  2. unsigned __stdcall SecondThread(void *arg);
  3. int _tmain(int argc, _TCHAR* argv[])
  4. {
  5.     int num = 0;
  6.     HANDLE hThread[2];
  7.     hThread[0] = (HANDLE) _beginthreadex( NULL, 0, FirstThread, (void*)num, 0, 0);
  8.     Sleep(1);
  9.     hThread[1] = (HANDLE) _beginthreadex( NULL, 0, SecondThread, (void*)num, 0, 0);
  10.     WaitForMultipleObjectsEx(2, hThread, TRUE, INFINITE, 0);
  11.     CloseHandle(hThread);
  12.     return 0;
  13. }
  14. unsigned __stdcall SecondThread(void *arg)
  15. {
  16.     int num = (int) arg;
  17.     for( ; num<10; num++)
  18.     {
  19.         printf(“secondThread a = %dn, num);
  20.     }
  21.     return 0;
  22. }
  23. unsigned __stdcall FirstThread(void *arg)
  24. {
  25.     int num = (int)arg;
  26.     for( ; num <10; num++)
  27.     {
  28.         printf(“firstThread %dn, num);
  29.     }
  30.     return 0;
  31. }

위의 코드를 작성해서 실행해보면 각 스레드의 순서가 뒤죽박죽되어서 출력됩니다. 이를 제어하는 역할을 Mutex가 합니다.

먼저 WaitSingleObject로 Mutex핸들을 대기하게 한 후, ReleaseMutex로 뮤텍스를 해제 합니다. 그럼 WaitSingleObject와 ReleaseMutex사이에 있는 루틴이 실행될 때에는 다른 스레드가 끼어들지 못하게 됩니다.

아래는 Mutex 사용 예시 코드 입니다.

  1. unsigned __stdcall FirstThread(void *arg);
  2. unsigned __stdcall SecondThread(void *arg);
  3. HANDLE hMutex;
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6.     int num = 0;
  7.     HANDLE hThread[2];
  8.     hThread[0] = (HANDLE) _beginthreadex( NULL, 0, FirstThread, (void*)num, 0, 0);
  9.     Sleep(1);
  10.     hThread[1] = (HANDLE) _beginthreadex( NULL, 0, SecondThread, (void*)num, 0, 0);
  11.     WaitForMultipleObjectsEx(2, hThread, TRUE, INFINITE, 0);
  12.     CloseHandle(hThread);
  13.     return 0;
  14. }
  15. unsigned __stdcall SecondThread(void *arg)
  16. {
  17.     WaitForSingleObject(hMutex, INFINITE);
  18.     int num = (int) arg;
  19.     for( ; num<10; num++)
  20.     {
  21.         printf(“secondThread a = %dn, num);
  22.     }
  23.     ReleaseMutex(hMutex);
  24.     return 0;
  25. }
  26. unsigned __stdcall FirstThread(void *arg)
  27. {
  28.     WaitForSingleObject(hMutex, INFINITE);
  29.     int num = (int)arg;
  30.     for(; num <10; num++)
  31.     {
  32.         printf(“firstThread %dn, num);
  33.     }
  34.     ReleaseMutex(hMutex);
  35.     return 0;
  36. }