개념만 알고 있던 뮤텍스를 C++ 코드로 직접 작성하여 사용해 봤다.
뮤텍스의 개념은 정말 간단한데, 자원에 한번에 하나의 Thread나 프로세스가 접근하게 하기 위해 사용할 때 잠그고, 나올 때 풀어주며 사용하려 할 때 잠겨있으면 풀릴 때까지 기다리는 것이다.
예제 소스는 위에 첨부했다.
- 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(NULL, 0, increase_num, (LPVOID)100000, 0, &dThreadId); HANDLE hThread_2 = CreateThread(NULL, 0, increase_num, (LPVOID)100000, 0, &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(NULL, 0, increase_num, (LPVOID)100000, 0, &dThreadId); HANDLE hThread_2 = CreateThread(NULL, 0, increase_num, (LPVOID)100000, 0, &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 기반 매크로 프로그램 (5) | 2016.11.28 |
[PyQt4] 0x07. WebBrowser (0) | 2016.11.21 |
[PyQt4] 0x06. QYolk III (0) | 2016.11.18 |
[PyQt4] 0x05. Final Text Editor (0) | 2016.11.17 |