본문 바로가기

프로그래밍/시스템

[윈도우 프로그래밍] 뮤텍스 크리티컬섹션

반응형

< 크리티컬섹션 (Critical section) >

 

유저모드 동기화 객체 

 

커널모드 객체가 아니기 때문에 가볍고 같은 프로세스내에 

스레드 동기화에 사용할 수 있다. 

 

EnterCriticalSection을 호출하면 객체는 비신호 상태가 되고, 

LeaveCriticalSection을 호출하면 신호상태로 바뀌어서 

다른 스레드들이 접근가능하다.

 

 

 

 

< 뮤텍스 (Mutex) >

 

 

커널모드 동기화 객체 

 

커널모드라서 크리티컬 섹션보다는 느리지만 프로세스를 넘어서 

모든 스레드에 사용 될 수 있는 동기화 객체이다. 

 

뮤텍스를 신호상태로 생성한 후 스레드에서 Wait 함수를 호출하면

뮤텍스는 비신호 상태가 되어서 다른 스레드에서는 접근하지 못한다.

 

 

ReleaseMutex를 호출하면 뮤텍스는 신호상태가 되어 

다른 스레드들이 접근가능하다.

 

 

참고:
http://alones.kr/%ED%81%AC%EB%A6%AC%ED%8B%B0%EC%BB%AC%EC%84%B9%EC%85%98-%EB%AE%A4%ED%85%8D%EC%8A%A4-%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4%EC%9D%98-%EC%B0%A8%EC%9D%B4/













< 크리티컬 섹션과 뮤텍스의 차이 >





   크리티컬 섹션은 한 프로세스안에서만 동작하고 

  

   뮤텍스는 여러 프로세스의 스레드에 대해서도 동작한다.

 

 

 

 

 

 

 

[출처] 크리티컬 섹션, 뮤텍스|작성자 yuc1206

 

<뮤텍스.c> 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <windows.h> // HANDLE DWORD
#include <process.h>
//쓰레드풀
int total;
HANDLE hMutex;
unsigned int __stdcall ThreadFunc(void*);
int _tmain(void
{
 //FALSE는 누구나 가질 수 있는 상태 , 즉 SIGNAL 임 
 hMutex = CreateMutex(NULL, FALSE, NULL);
 _tsetlocale(LC_ALL, _T("korean"));
 
 HANDLE hThread[50];
 unsigned int dwThreadID[50];
 for (int i = 0; i < 50; i++)
  hThread[i] = (HANDLE)_beginthreadex(
   NULL,
   0,
   ThreadFunc,
   NULL,
   CREATE_SUSPENDED,
   &dwThreadID[i]);
 
 //스케줄러에 쓰레드가 레디가 된것을 통보한다.
 for (int i = 0; i < 50; i++)
  ResumeThread(hThread[i]);
  WaitForMultipleObjects(50, hThread, TRUE, INFINITE);
 for (int i = 0; i < 50; i++)
  CloseHandle(hThread[i]);
 CloseHandle(hMutex);
 return 0;
}
unsigned int __stdcall ThreadFunc(void*lParam)
 // Mytex가 signal일때까지 기다리고 누군가
 // signal인 순간에는 non-signal로 바뀐다.
 WaitForSingleObject(hMutex, INFINITE);
 for (int i = 0; i < 10000; i++)
 {
  total++;
  //FILE *op = fopen("1.txt","r")
  //_ftprintf(stdout, _T("값 : %d\n"), total);
  _ftprintf(stdout, _T("값 : %d\n"), total);
 }
 ReleaseMutex(hMutex); // signal로 만든다
 return 0;
// 뮤텍스
cs

 

 


<크리티컬섹션.c>

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <windows.h> // HANDLE DWORD
#include <process.h>
//쓰레드풀
int total;
CRITICAL_SECTION cs;
unsigned int __stdcall ThreadFunc(void*);
int _tmain(void)
{
 //FALSE는 누구나 가질 수 있는 상태 , 즉 SIGNAL 임 
 
 InitializeCriticalSection(&cs);
 _tsetlocale(LC_ALL, _T("korean"));
 HANDLE hThread[50];
 unsigned int dwThreadID[50];
 for (int i = 0; i < 50; i++)
  hThread[i] = (HANDLE)_beginthreadex(
   NULL,
   0,
   ThreadFunc,
   NULL,
   CREATE_SUSPENDED,
   &dwThreadID[i]);
 //스케줄러에 쓰레드가 레디가 된것을 통보한다.
 for (int i = 0; i < 50; i++)
  ResumeThread(hThread[i]);
 WaitForMultipleObjects(50, hThread, TRUE, INFINITE);
 for (int i = 0; i < 50; i++)
  CloseHandle(hThread[i]);
 DeleteCriticalSection(&cs);
 return 0;
}
unsigned int __stdcall ThreadFunc(void*lParam)
{
 // Mytex가 signal일때까지 기다리고 누군가
 // signal인 순간에는 non-signal로 바뀐다.
 EnterCriticalSection(&cs);
 for (int i = 0; i < 10000; i++)
 {
  total++;
  //FILE *op = fopen("1.txt","r")
  //_ftprintf(stdout, _T("값 : %d\n"), total);
  _ftprintf(stdout, _T("값 : %d\n"), total);
 }
 LeaveCriticalSection(&cs);
 return 0;
// 크리티컬섹션
cs

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형