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
반응형
'Programming > C++' 카테고리의 다른 글
[ Windows Socket ] 소켓 프로그래밍/소켓 통신 예제 간단한 채팅 프로그램 (4) | 2021.09.17 |
---|---|
[ C++ ] 템플릿과 표준 템플릿 라이브러리(STL) (0) | 2021.06.09 |
[ C++ ] 가상함수와 추상클래스 (0) | 2021.05.26 |
[ C++ ] 상속의 개념 | 상속 예제 (0) | 2021.05.18 |
[ C++ ] 프렌드함수 || 연산자 중복 || 프렌드함수 예제, 연산자 중복 예제 (0) | 2021.05.11 |