2013-07-18 5 views
0
#include<stdio.h> 
#include<stdlib.h> 
#include<pthread.h> 

void * function(void *); 

main() 
{ 
    pthread_t p[5]; 
    int j; 
    int *arg1[4]; 
    int arr[5]={1,2,3,4,5}; 
    for(j=0;j<=4;j++) 
    pthread_create(&p[j],NULL,function,&arr[j]); 
    for(j=0;j<=4;j++) 
    pthread_join(p[j],(void **)&arg1[j]); 
    for(j=0;j<=4;j++) 
    printf("\n%d",*arg1[j]); 

} 

void * function(void *arg) 
{ 
int *i = (int *) arg; 
pthread_exit(i); 
} 

Output: 
-1498551536 
32767 
3 
4 
5 

Q.1) 항상 처음 두 값에 대한 정크 값을 인쇄합니다. 왜 그래야만하지? 여기에 뭐가 잘못 되었다면 저를 바로 잡으십시오.Pthread_join & Pthread_exit in c

아래 코드를 변경하면 올바르게 1,2,3,4,5가 인쇄됩니다.

for(j=0;j<=4;j++) 
    { 
    pthread_join(p[j],(void **)&arg1[j]); 
    printf("\n%d",*arg1[j]); 
    } 
Q.2) 스레드로부터 값을 반환하는 다른 방법은 무엇입니까? 모든 방법을 예를 들어 요약하고 따르는 방법을 설명해 주시겠습니까?

답변

1

arg1은 크기가 4이지만 5를 채우고 있습니다. 적절한 크기로 설정하면 문제가 해결됩니다.

예를 들어 작동하지 않는 경우 인쇄하기 전에 모든 스레드를 pthread_join해야 인쇄됩니다. 다섯 번째 스레드에 참여할 때 인쇄하기 전에 손상이 발생합니다.

예제에서 작동하면 다음 스레드에 참여하기 전에 각 결과를 인쇄하십시오. 이것은 다섯 번째 쓰레드가 첫 번째와 두 번째 값을 덮어 쓰기 전에 (여전히 덮어 쓰여지고 있음) 인쇄하기를 의미합니다.

처음 두 개가 손상된 이유는 int가 32 비트이고 포인터가 64 비트이기 때문입니다. 그래서 1 여분의 포인터가 다음 두 int 위치를 엉망으로 만듭니다.

스레드에서 복잡한 결과를 반환하는 경우 pthread_exit는 void *를 반환하고 pthread_join은 반환 값을 출력 매개 변수로 가져옵니다.

pthread_join

그래서 당신은 다음, 원시 값보다 더 리턴 함께 구조체를 넣어 그것을 반환해야합니다.