2011-09-21 4 views
0

다음은 흔히 볼 수있는 스레드 생성 코드의 예입니다. pthread_create는 많은 포인터/주소를 사용하며 이것이 왜 그렇게 궁금합니다.pthreads 및 포인터에 대한 질문

pthread_t threads[NUM_THREADS]; 
    long t; 
     for(t=0; t<NUM_THREADS; t++){ 
      rc = pthread_create(&threads[t], NULL, &someMethod, (void *)t); 
     } 

변수 배열을 참조하기 위해 '&'를 사용하는 큰 장점이나 차이가 '스레드'뿐만 아니라 '것으로 someMethod'로 (그냥 '스레드'그냥 '것으로 someMethod'반대)? 또한 왜 't'가 보통 't'대신 void 포인터로 전달 되는가?

답변

2
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
    void *(*start_routine)(void*), void *arg); 

당신은 pthread_createpthread_t 변수에 pointer을 통과해야합니다. &threads[t]threads+t이 문제를 해결합니다. threads[t]하지 않습니다. pthread_create은 포인터를 통해 값을 반환 할 수 있도록 포인터가 필요합니다.

someMethod은 함수의 주소이므로 세 번째 인수에 적합한 표현식입니다. 나는 &someMethod이 중복으로 동일하다고 생각하지만 확실하지 않습니다.

void *으로 처리하기 위해 t에서 void *을 캐스팅합니다. 나는 longvoid *에 적합하다고는 생각하지 않는다. 보증이 존재하는 경우에도 분명히 차선책입니다. 명확성을 위해 그리고 예상되는 void *과의 호환성을 보장하기 위해 t (&t, 캐스트가 필요 없음)에 대한 포인터를 전달해야합니다. 그에 따라 someMethod을 조정하는 것을 잊지 마십시오.


pthread_t threads[NUM_THREADS]; 
long t; 
for (t=0; t<NUM_THREADS; t++) { 
    rc = pthread_create(&threads[t], NULL, someMethod, &t); 
} 
관련 문제