2010-11-19 2 views
4

C 멀티 쓰레딩에 대해 배우려고 노력 중이며 몇 가지 드문 것들을 보았습니다.C 멀티 쓰레드에서 쓰레드에 파라미터를 올바르게 전달하는 방법

스레드로 매개 변수를 전달할 때 포인터를 사용해야한다는 것을 알고 있습니다. 나는 내가 모르는 모범을 발견했다. 관련 전화 번호를 복사하겠습니다 :

pthread_t tid[MAX_THREADS] 
int n_veg 
pthread_create(&tid[n],NULL,caracter,(void *)n_veg) 

caracter는 분명히 미리 선언 된 기능입니다.

이제 우리는 왜 int 포인터 캐스팅 대신 void 포인터 캐스팅을 사용합니까? 관련성이 있습니까?

둘째, 왜 포인터 캐스팅을 처음 사용합니까? 첫 번째 매개 변수와 같이 "& n_veg"을 사용할 수 없습니까?

미리 감사드립니다. 다음과 같이

답변

10

두 질문이 모두 관련되어 있으므로 pthread_createvoid * 매개 변수를 사용하므로 실제로 원하는 포인터를 전달할 수 있습니다. 그러나이 경우 포인터를 전달하는 것이 아니라 포인터로 캐스팅 된 단순한 정수 값입니다. 에, 사실

int value = *(int *)n_veg; 

:

당신이 언급 한 바와 같이
int value = (int)n_veg; 

, 당신은 아주 잘 &n_veg으로 실제 포인터를 통과하고 같은 값을 검색 할 수있다 : 즉, caracter이 같은 액세스 의미 대부분의 경우, 구조체와 같은 정수보다 많은 데이터를 전달해야하며,이 경우 포인터를 전달해야합니다. 단순히 포인터를 정수와 같은 포인터로 캐스팅 할 수는 없기 때문입니다.

포인터를 전달할 때 염두에 두어야 할 점 중 하나는 스레드가 실행되는 동안 n_veg이 범위를 벗어나면 안됩니다. 예를 들어, 당신이 할 경우 :

void test() { 
    int n_veg; 
    pthread_create(&tid[n],NULL,caracter,&n_veg); 
} 

&n_vegtest 등의 반환으로 무효가되지만, 스레드가 계속 실행 될 수 있으며 잘못된 주소를 개최합니다. 이 때문에 스레드에 전달 된 구조는 일반적으로 malloc을 사용하여 동적으로 할당되며 스레드는 완료되면 free 수 있습니다.

+0

그래서 정수로 작업하는 경우 실제 포인터를 전달하거나 값을 캐스팅하는 것 사이에 실제적인 차이가 있습니까? 왜, * (int *) n_veg입니까? 두 번째 질문이 어리석은 경우 유감입니다. 프로그래밍에 관한 두 번째 해이자 이번 주까지만 java를 사용했습니다./ – bluehallu

+1

@Hallucynogenyc : 예. 있습니다. 실제 포인터를 전달하면 포인터를 사용하여 원래 값을 변경할 수 있습니다.'* (int *) n_veg' :'void *'를 사용하려면 실제 타입으로 변환해야합니다. 그러므로'(int *)', 그리고'*'는 포인터를 역 참조하여 값을 얻습니다. – casablanca

+0

모두 삭제되었습니다. 고마워요! – bluehallu

0

pthread_create 정의됩니다 :

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

그래서 그것의 마지막 매개 변수로 void *을 기대하고있다. 캐스트를 생략하면 컴파일러에서 경고를 표시합니다.

+0

아, 그냥 메서드가 묻는 것입니다 ... void 포인터가 메서드에 투명하게 작동한다고 생각했습니다. 잊어 버려. – bluehallu

관련 문제