2012-10-03 4 views
0

나는이 코드 조각을 찾고 있어요 :시험 공부를위한 설명을 찾고 있습니다. pthread_join. 이 코드는 무엇을하고 있습니까?

/* 04-join.c 

Simple illustration of dividing work among two threads 

pthread.h should be first otherwise compile with -D_THREAD_SAFE 
*/ 
#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    int *ar; 
    long n; 
    int id; 
    int sum; 
} subarray; 


void *incer(void *arg) { 
    long i; 
    int id = ((subarray*)arg)->id; 

    printf("Start thread: %d sum=%ld\n",id, ((subarray*)arg)->sum); 
    for (i = 0; i < ((subarray*)arg)->n; i++) { 
     ((subarray*)arg)->ar[i]++; 
     ((subarray*)arg)->sum++; 
    } 
    printf("Terminating thread: %d sum=%ld\n",id, ((subarray*)arg)->sum); 
    pthread_exit(NULL); 
} 

int main() { 
    int ar[1000000]; 
    pthread_t th1, th2; 
    subarray sb1, sb2; 

    sb1.ar = &ar[0]; 
    sb1.n = 500000; 
    sb1.id = 1; 
    sb1.sum = 0; 
    pthread_create(&th1, NULL, incer, &sb1); 

    sb2.ar = &ar[500000]; 
    sb2.n = 500000; 
    sb2.id = 2; 
    sb2.sum = 0; 
    pthread_create(&th2, NULL, incer, &sb2); 

    pthread_join(th1, NULL); 
    pthread_join(th2, NULL); 
    printf("Terminating main: %d sum=%d\n",getpid(),sb1.sum+sb2.sum); 
    pthread_exit(NULL); 
    return 0; 
} 

내 질문은, for 루프의 기능 incer에. 우리는 정수에 대한 포인터이며, 정확히 이루어 subarry 구조체 아칸소에서 코드

((subarray*)arg)->ar[i]++; 

의 조각이? 그래서 ar [i] ++는 무엇을합니까? 그것은 왜 행해지 는가? 합계를 증가 시킴과 동시에이 스레드가 "작업 완료"를 시뮬레이션합니까?

또 하나의 작은 질문입니다. incer 앞에있는 "void *"의 목적은 무엇입니까? void *의 중요성에 대해 나는 그 부분을 놓쳤다.

이 포인터는 incer 함수의 주소를 가리 킵니다. 그리고 함수를 생성함으로써 "incer"라고 불리는 void *가 생성되고 스레드를 생성 할 때이 코드 섹션을 참조 할 수 있으므로이 코드 섹션을 실행한다는 것을 알 수 있습니까?

왜 pthreads입니까? 프로세스 스레드?

+0

"pthreads"의 "p"는 "POSIX"를 의미합니다. – arrowd

답변

0

리턴 타입이 void *로 선언 된 Incer는 종료 될 때 값을 리턴 할 수 있으며, 스레드가 pthread_joining 할 때 검색됩니다. 반환 값은 힙에 할당되고 (void *)로 캐스트되어야 할 것입니다. 이 경우 스레드는 값을 반환하지 않고 pthread_join이 NULL 인수로 호출 될 때 주 프로세스가 반환 값을 기대하지 않습니다.

ar은 단일 정수에 대한 포인터 일 수 있지만 정수 배열에 대한 포인터 일 수도 있습니다. 이 경우 정수 배열입니다.

((서브 어레이 *) arg) → ar [i] ++; 인덱스 i의 정수를 1 씩 증가시킵니다.

+0

그래서 int * ar은 기본적으로 나처럼 int * ar []에 맞습니까? - 그래서 return 문이 도달하고 평가 될 때, 힙에 위치하게되고, 메인 프로세스 나 호출 프로세스에 리턴 값을 어떻게 알리는가? 호출 프로세스는 기다리고 있으므로 끊임없이 체크한다. 반환 값 그래서 뭔가 할 수 있습니까? - 그래서이 코드 조각은 int ar [100k]의 각 인덱스에 1을두고 매번 합계에 1을 더한 다음 매번 100K의 합계를보고합니다. pthread_join 호출 때문에? –

관련 문제