pthread 질문드립니다

redpig의 이미지

void *thread_func(void *param)
{
	printf("%d thread started\n", *(int *)param);
}
 
int main(void)
{
	while(1)
	{
		for(i=0; i<4; i++)
		{
			pthread_create(&thread[i], NULL, thread_func, (void *)&i);
		}
 
		for(i=0; i<4; i++)
		{
			pthread_join(thread[i], NULL);
		}
	}
}

루프를 돌며 쓰레드를 4개씩 생성하고 쓰레드 함수에선 자신이 몇번째 쓰레드인지 printf하는 아주 간단한 소스인데요..
처음 실행시에는
1 thread started
2 thread started
3 thread started
0 thread started
이렇게 정상적으로 나오는데..

while 루프를 한번 돌고난후 두번째 쓰레드 생성시에는

1 thread started
0 thread started
0 thread started
0 thread started

이렇게 엉뚱한 결과가 나오는데요..
소스에 문제 있는건가요?

chadr의 이미지

동일한 변수의 주소를 스레드 함수로 넘기면서 스레드가 끝나기도 전에 동일한 변수 값을 변경시켰습니다.(i++)
처음 나온 것은 우연히 잘 나온것 처럼 보인것 뿐이며 두번째 루프와 같이 비정상적으로 나와야지 정상입니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

gurugio의 이미지

쓰레드에 데이터를 넘길때는 각 쓰레드마다 고유한 데이터를 가지도록 해야합니다.
현재는 i변수를 모든 쓰레드가 공유하므로
main에서 i의 값이 바뀌고 있는데 쓰레드들이 그 값을 읽고 있습니다.

kid1402의 이미지

세마포어나 뮤텍스에 대한 자료를 찾아보시면 왜 다른지 아실거 같네요

redpig의 이미지

해결했습니다..
답변 감사합니다^^