728x90
반응형
#include <stdio.h>
#include <windows.h>
#include <process.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
unsigned WINAPI ThreadFunc(void *arg);
int g_checkid = 0;
int main(int argc, char *argv[]) {
HANDLE hThread,hThread2;
unsigned threadID;
int param=5;
hThread=(HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void*)¶m, 0, &threadID);
hThread2=(HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void*)¶m, 0, &threadID);
if(hThread==0){
puts(" beginthreadex() error");
return -1;
}
Sleep(3003);
puts("end of main");
g_checkid+=1;
printf("g_checkid = %d\n",g_checkid);
return 0;
}
unsigned WINAPI ThreadFunc(void *arg){
int i;
int cnt=*((int*)arg);
for(i=0; i<cnt ;i++){
Sleep(1000); puts("running thread\n"); printf("g_checkid = %d\n",g_checkid);
g_checkid+=10;
}
return 0;
}
여기서 프로세스와는 다른 스레드만의 특징을 찾아볼 수 있다.
g_checkid 라는 전역변수를 공유하는 것이다.
실행시키면 상황에 따라 값이 61이 나오기도, 41이 나오기도 한다.
다음에는 동기화에 대해서 공부해봐야겠다.
위와 같은 코드는 컴파일 에러는 나지 않고, main 에서 나오는 Sleep 을 크게 늘리면 값이 거의 고정적으로 61이 나오겠지만, 정말 간혹가다 41이라는 값이 튀어나올 수 있다.
즉, 컴파일에러는 나지 않지만 런타임 시 에러(원하는 값이 아니기 때문에 에러라고 표현)가 날 수 있는 확률을 가지고 있는 불완전한 코드인 것이다.
이러한 런타임 에러를 방지하기 위해 동기화가 필요하다.
같은 코드를 실행시키는데 위 사진과 같이 두 케이스가 나온다.
728x90
반응형
'Archive > Develop' 카테고리의 다른 글
개발 방법론 | SPA(Single Page Application) (0) | 2021.11.15 |
---|---|
[ Django ] Django REST Framework 000 (0) | 2021.11.15 |
[ 정규표현식 ] 패스워드 정책(영문자, 숫자, 특수문자, 8글자 이상) 패턴 (0) | 2021.10.28 |
[ Android ] 이미지 처리 라이브러리 글라이드(Glide) (0) | 2021.10.11 |
[ 정규표현식 ] email 주소 패턴 만들기 | 예제로 알아보는 정규표현식 | 정규표현식 예제 (0) | 2021.10.05 |