- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 재능이의 돈버는 일기
- StresslessLife
- K_JIN2SM
- 소소한 일상
- My Life Style & Memory a Box
- Blog's generation
- 공감 스토리
- 취객의 프로그래밍 연구실
- Love Me
- Dream Archive
- 세상에 발자취를 남기다 by kongmingu
- hanglesoul
- 카마의 IT 초행길
- 느리게.
- 미친듯이 즐겨보자..
- Joo studio
- Gonna be insane
- 악 다 날아갔어!! 갇대밋! 왓더...
- xopowo05
- 맑은공기희망운동
- 엔지니어 독립운동
- 혁준 블로그
- Simple in Complex with Simple
- 무의식이 의식을 지배한다
드럼치는 프로그래머
[TCP/IP] 임계영역 (Critical Section) 본문
다음과 같은 동기화 되지 않은 쓰레드 코드가 있다고 가정해보자
int suInt[100];
DWORD WINAPI MyThread_1(LPVOID arg)
{
for (int i=0; i<100; i++)
{
suInt[i] = 1;
Sleep(10);
}
return 0;
}
DWORD WINAPI MyThread_2(LPVOID arg)
{
for (int i=98; i>=0; i--)
{
suInt[i] = 2;
Sleep(10);
}
return 0;
}
void main()
{
HANDLE hThread[2];
DWORD ThreadId[2];
hThread[0] = CreateThread(NULL,0,MyThread_1,NULL,0,&ThreadId[0]);
hThread[1] = CreateThread(NULL,0,MyThread_2,NULL,0,&ThreadId[1]);
for(int i=0; i<100; i++)
cout << suInt[i] <<" ";
}
의도한 결과값은 2가 98번 나오고 1이 1번 출력이 되어야 한다.
하지만 막상 실행해보면 2와 1이 불규칙적으로 출력이 된다.
쓰레드 1,2가 공유자원 suInt에 불규칙적으로 접근했기 떄문에 데이터가
의도되지 않게 입력 되었다.
임계영역은 두개 이상의 쓰레드가 공유리소스를 접근할 때 오직 한 쓰레드만
접근을 해야 하는 경우에 사용한다.
⊙ 임계영역은 유저영역 메모리에 존재하는 구조체다. 따라서 다른 프로세스가
접근 할 수 없으므로,한 프로세스에 속한 동기화에만 사용 할 수 있다.
⊙ 일반적인 동기화 객체보다 빠르다.
임계영역을 사용하여 수정한 코드
CRITICAL SECTION cs; //임계영역 설정
DWORD WINAPI MyThread_1(LPVOID arg)
{
//이 영역안에서 공유자원에 접근 할 경우 다른쓰레드가 침범하지 못한다
EnterCriticalSection(&cs);
for (int i=0; i<100; i++)
{
suInt[i] = 1;
Sleep(10);
}
LeaveCriticalSection(&cs);
return 0;
}
DWORD WINAPI MyThread_2(LPVOID arg)
{
EnterCriticalSection(&cs);
for (int i=98; i>=0; i--)
{
suInt[i] = 2;
Sleep(10);
}
LeaveCriticalSection(&cs);
return 0;
}
void main()
{
InitializeCriticalSection(&cs); //임계영역 초기화
HANDLE hThread[2];
DWORD ThreadId[2];
hThread[0] = CreateThread(NULL,0,MyThread_1,NULL,0,&ThreadId[0]);
hThread[1] = CreateThread(NULL,0,MyThread_2,NULL,0,&ThreadId[1]);
WaitForMultipleObjects(2,hThread,TRUE,INFINITE); //쓰레드 종료대기
DeleteCriticalSection(&cs); //임계영역 제거
for(int i=0; i<100; i++)
cout << suInt[i] <<" ";
}
[출처] 임계영역 (Critical Section)|작성자 로지어
'★─Programing > ☆─TCP IP' 카테고리의 다른 글
[TCP/IP] CreateThread 후에 바로 CloseHandle하는 이유 (0) | 2008.05.09 |
---|---|
[TCP/IP] CreateThread() (0) | 2008.05.09 |
[TCP/IP] IPv4의 주소체계 (0) | 2008.04.17 |
[TCP/IP] 리눅스 C - sleep 함수 (0) | 2008.03.25 |
[TCP/IP] TCP/IP 프로트콜 구조 (0) | 2008.03.19 |