2012-03-13 5 views
0

클라이언트에서 요청할 때마다 스레드를 만들어 서버에서 파일을 가져옵니다. 스레드 함수는 일반적으로 void 포인터를 가져옵니다. 하지만 매개 변수로 char 포인터를주고 스레드 함수에 의해 파일 이름을 채우고 싶습니다.스레드 함수의 void * 매개 변수를 변경하는 방법

pt_ret = pthread_create(&thread_id, NULL, getfiles, (void*) thread_buff); 
pthread_join(thread_id, pt_ret); 

정의 :

코드는 스레드를 생성한다. 스레드 기능 :

void *getfiles(void *ptr) { 
    /* ... */ 
    char buff[256]; // populating that local buffer with the file names 
    // ptr should be as a return of buff 
} 

나는 다른 시도를했지만 그 스레드가 완료된 후에는 thread_buff가 'Q'가됩니다. 당신이 실제로 그것을 알고 있기 때문에

+1

C에서 'void *'에 대한 포인터를 캐스팅 할 필요가 없습니다. –

+0

더 많은 코드를 게시 할 수 있습니까? – Jay

답변

2

그냥 가 문자 *이다, 숯불 *에 캐스팅 :

void *getfiles(void *ptr) { 
    /* ... */ 
    const char *ptr_char = (const char*)ptr; 
    char buff[256]; 
    memcpy(buff, ptr_char, 256); //just as an example, check the sizes. 
    //you could also strcpy, that's up to you 
} 

또는 당신은 또한 그냥 복사하지 않고, ptr이 가리키는 버퍼에 일할 수있는, 그래서이다 액세스 할 수있는 스레드가 종료 된 후 :

void *getfiles(void *ptr) { 
    /* ... */ 
    char *buff = (char*)ptr; 
    /* do stuff with buff. */ 
} 
+0

작동하지 않았습니다. 출력은 여전히 ​​'Q'입니다. –

+0

편집 됨, 두 번째 해결 방법을 확인하십시오. – mfontanini

+0

캐스트가 필요 없으며 난독 화됩니다. 간단히 지정하십시오. –

0

나는 문제는 스레드가 종료 된 후에 스레드의 "광"VAR에 저장된 데이터를 사용하려는 생각합니다. 불가능한 것은 데이터가 일시적으로 스택에만 존재한다는 것입니다. 스레드에 thread_buff 대신 (* 무효)의 & thread_buff을

*ptr = strdup(buff) 

그리고 (* 무효)에 합격 :

당신은 문자 ** PTR을 통과와 같은 버프의 사본을 채울 수 있습니다 기능.

+0

왜 char 포인터에 대한 포인터를 전달해야합니까? 버퍼는, thread가 thread * buff의 복사본을 참조하도록 char * – mfontanini

+0

을 사용하면 스레드가 종료 된 후에도 계속 사용할 수 있습니다. 그러나 나는 op의 코멘트 'ptr가 광의 반환이어야한다'라는 것을 인정해야한다. 혼란 스럽다. – huelbois

관련 문제