~/Desktop/starvation.c.html
#include <stdio.h>
#include <string.h>
#include <pthread.h>

void* thread_main1(void*);
void* thread_main2(void*);

pthread_mutex_t MUTEX = PTHREAD_MUTEX_INITIALIZER;

char buf[255];
int length;

int main()
{

	pthread_t id[5];
	pthread_create(&id[0],NULL,thread_main1,NULL);
	pthread_create(&id[1], NULL, thread_main2, NULL);


	pthread_join(id[1], NULL);
	pthread_join(id[0], NULL);




return 0;

}

void* thread_main1(void* arg)
{
int i;
for(i=10; i>0 ; i--)
{
	pthread_mutex_lock(&MUTEX);
	printf("thread#1 Locked %d  %s\n",i, buf);
	pthread_mutex_unlock(&MUTEX);
	sleep(1);
}
}

void* thread_main2(void* arg)
{

int j;
for(j=10; j>0; j--)
{
	pthread_mutex_lock(&MUTEX);
	printf("thread#2 Lock %d\n",j);
	length = scanf("%[^\n]%*c",buf);
	pthread_mutex_unlock(&MUTEX);
	sleep(1);
}
}
배운거랑 다르게 막상 플그램을 만들다보면 전혀 눈치를 못 챈다

일부로 buf 변수라는 critical section을 만들고 출력과 입력이 동일한 변수를 사용하게 만들었다
그리고 서로 자원을 가지고 경쟁하도록 했으며 자원을 사용할 때는 lock을 걸어서 이상이 없도록 했다
상식적으로 scanf를 통해서 입력 받는 i/o타임이 buf에서 읽어서 출력하는 부분보다 클테니까
thread_main2는 한 두번 정도 실행되고 thread_main1이 주욱 실행 되거나
너한번 나한번, 기타 등등 뭐 그런 형식으로 진행 될 것 같았다
여기 까지는 아무런 문제가 없어보인다
그런데 실제로 프로그램을 돌려보니 예상 했던 것과는 결과가 다르게 나왔다

thread_main2만 줄창 실행되더라
즉 thread_main2가 락을 풀자마자 다시 락을 또 걸고 자원을 독점해버리는 것이었다
으...스케쥴 정책이 도대체 어떻게 되어있길래 이런 결과가 나오는건지

그런데 더 웃긴건 집에서 해보니 정상적으로 퐁당퐁당으로 되더라
애초에 race condition을 가정하고 만들긴 했는데 컴퓨터에 따라서 독점이냐 아니면 적당히냐가 완전히 달랐다

진짜 큰 교훈이 되었다 테스트 환경 c2d 5x00 vmplayer ubuntu 10.04 LTS, i3 2100 ubuntu 11.10


'devel > man & example' 카테고리의 다른 글

strstr  (0) 2012.01.28
arm inline assembly  (0) 2011.12.24
scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기  (2) 2011.11.27
function pointer  (0) 2009.11.24
sprintf int to ascii  (0) 2009.11.08
Posted by 쵸코케키

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
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

최근에 올라온 글

최근에 달린 댓글

글 보관함