[C++] CreateMutex

Programming 2016. 11. 22. 16:34



개념만 알고 있던 뮤텍스를 C++ 코드로 직접 작성하여 사용해 봤다.
뮤텍스의 개념은 정말 간단한데, 자원에 한번에 하나의 Thread나 프로세스가 접근하게 하기 위해 사용할 때 잠그고, 나올 때 풀어주며 사용하려 할 때 잠겨있으면 풀릴 때까지 기다리는 것이다.


With_Mutex.cpp

Without_Mutex.cpp


예제 소스는 위에 첨부했다.


- Without_Mutex.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <Windows.h>
 
unsigned int g_num = 0;
 
DWORD WINAPI increase_num(LPVOID max_num)
{
    for (int i = 0; i < (int)max_num; i++) {
        g_num++;
    }
    return 0;
}
 
int main(int argc, char* argv[])
{
    DWORD dThreadId;
    HANDLE hThread_1 = CreateThread(NULL0, increase_num, (LPVOID)1000000&dThreadId);
    HANDLE hThread_2 = CreateThread(NULL0, increase_num, (LPVOID)1000000&dThreadId);
    
    WaitForSingleObject(hThread_1, INFINITE);
    WaitForSingleObject(hThread_2, INFINITE);
 
    std::cout << g_num << std::endl;
    return 0;
}
 
 
cs



뮤텍스 없이 Thread 두 개를 만들어 전역변후 g_num에 1을 더하는 동작을 10만번씩 반복하게 했다.

정상적으로 돌았다면 200000이라는 결과가 나와야 하지만 결과는 다음과 같이 훨씬 작은 값이 나왔다.

동시에 한 자원에 접근했기 때문이다.




- With_Mutex.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <Windows.h>
 
unsigned int g_num = 0;
HANDLE hMutex;
 
DWORD WINAPI increase_num(LPVOID max_num)
{
    for (int i = 0; i < (int)max_num; i++) {
        WaitForSingleObject(hMutex, INFINITE);
        g_num++;
        ReleaseMutex(hMutex);
    }
    return 0;
}
 
int main(int argc, char* argv[])
{
    hMutex = CreateMutex(NULL, FALSE, NULL);
 
    DWORD dThreadId;
    HANDLE hThread_1 = CreateThread(NULL0, increase_num, (LPVOID)1000000&dThreadId);
    HANDLE hThread_2 = CreateThread(NULL0, increase_num, (LPVOID)1000000&dThreadId);
    
    WaitForSingleObject(hThread_1, INFINITE);
    WaitForSingleObject(hThread_2, INFINITE);
 
    std::cout << g_num << std::endl;
    return 0;
}
cs


이번에는 뮤텍스를 가져다가 사용해 봤다.

WaitForSingleObject에 뮤텍스를 넘기면 Release될 때까지 기다린다고 한다.

이후 작업을 수행했으면 Lock이 걸린 Mutex를 Release해준다.



정상적으로 200000이 찍히는 것을 볼 수 있다.




'Programming' 카테고리의 다른 글

[C++] std::for_each  (0) 2016.12.12
[Python] Pacro : Python 기반 매크로 프로그램  (4) 2016.11.28
[C++] CreateMutex  (2) 2016.11.22
[PyQt4] 0x07. WebBrowser  (0) 2016.11.21
[PyQt4] 0x06. QYolk III  (0) 2016.11.18
[PyQt4] 0x05. Final Text Editor  (0) 2016.11.17
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

댓글을 달아 주세요

  • 2016.11.30 15:29  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • __미니__ 2016.12.01 09:02 신고  댓글주소  수정/삭제

      어제 바로 답변드리려고 했는데 갑자기 좀 바빠져서 답변을 못 드렸었네요.

      무지 오래전에 만든 프로그램이다 보니 거의 흑역사 수준이라 처음부터 다시 짜고 싶은 마음이 굴뚝같지만 일단 간단한 해결법만 알려드리겠습니다.

      myApp 클래스 내부의 함수 sendMessage를 보시면 아마 58번줄에
      sock.send(message)
      라고 되어있을겁니다. 이부분을
      sock.send(message.encode('utf-8'))
      이렇게 바꿔주세요.
      그럼 한글도 입력됩니다~