본문 바로가기
Programming/C++

[ C/C++ ] Window Thread 프로그래밍

by 코뮤(commu) 2021. 10. 29.
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*)&param, 0, &threadID);
	hThread2=(HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void*)&param, 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
반응형