2014-04-07 1 views
1

에 이르게 내가 가진는 pthread_create이 코드입니다 이상한 출력

producer thread: #1 in critical setion 
000 
100 
consumer thread: #4 in critical setion 
100 
after change 
000 
producer thread: #0 in critical setion 
000 
010 
consumer thread: #1 in critical setion 
010 
after change 
000 
producer thread: #1 in critical setion 
000 
001 
producer thread: #2 in critical setion 
001 
101 
consumer thread: #2 in critical setion 
101 
after change 
100 
consumer thread: #2 in critical setion 
100 
after change 
000 
producer thread: #2 in critical setion 
000 
010 
consumer thread: #4 in critical setion 
010 
after change 
000 

결과는 것을 제외하고 예상된다 카운트까지해야 이 경우에는 "# 3"이 없지만 0에서 4까지입니다. 그리고 "#"은 프로그램을 실행할 때마다 바뀝니다. 때로는 "# 0"과 "# 1"만 표시되기도합니다.

답변

2

pthread_create의 마지막 인수가 문제입니다. i에 대한 포인터를 전달하지만 주 루프가 실행될 때 i 값이 변경됩니다. 스레드가 인쇄를 실행하고 포인터를 존중할 때 i이 여전히 0 (또는 1 또는 2 또는 3)이라는 보장은 없습니다.

간단한 변경을 시도하십시오. 그것은 당신에게 예상되는 결과를 얻을 수 :

int i; 
int id[4] = { 1, 2, 3, 4 }; 
for (i = 0; i < NUM_COMSUMERS; i++) { 
    pthread_create(consumers+i, NULL, Consumer, id + i); 
} 
for (i = 0; i < NUM_PRODUCERS; i++) { 
    pthread_create(producers+i, NULL, Producer, id + i); 
} 

는 위의 더 일반적인 만들기 위해 재 작업이 필요합니다, NUM_CONSUMERSNUM_PRODUCERS 4 가정합니다.

for (i = 0; i < NUM_COMSUMERS; i++) { 
    pthread_create(consumers+i, NULL, Consumer, (void *)i); 
} 
for (i = 0; i < NUM_PRODUCERS; i++) { 
    pthread_create(producers+i, NULL, Producer, (void *)i); 
} 

그리고 당신의 스레드에서

, 인수 역 참조, 단지 int에 캐스팅하지 않습니다 :

다른 방법으로는 다음 작업을 수행 할 수있는 포인터를 전달하는 것이 필요하지 할

printf("producer thread: #%d in critical section\n", (int)arg); 

과 :

printf("consumer thread: #%d in critical section\n", (int)arg); 

참고 : CASTIN 당신은 얻을 것이다 경고 g는 64 비트 시스템에서 포인터와 int 사이의 값입니다.

+0

정말 고마워요! 나는 무엇이 잘못되었는지 이해합니다. 그러나 두 번째 방법은 시도 할 때 작동하지 않습니다. 세그먼트 오류가 발생합니다. – user2895478

+0

@ user2895478 : 두 번째 방법과 관련된 변경 사항을 명확히하기 위해 게시물을 약간 업데이트했습니다. 나는 그것을 테스트했고 기대했던 결과를 얻었다. 앞서 언급했듯이 포인터를 통해 값을 전달할 수 있습니다. 스레드 코드에서 참조를 취소하지 않았는지 확인하십시오. – esorton