2014-01-28 5 views
0

может кто-нибудь сказать мне, что я делаю неправильно? (я опустил остальную часть программы, потому что его очень долго ...)не может создать нить правильно

#include <pthread.h> 

void *RTPfun(char *client_addr); 

int main(int argc, char *argv[]) 
{ 
    char* client_addr; 
    pthread_t RTPthread; 

    // ... 

    pthread_create(&RTPthread, NULL, &RTPfun, client_addr) 
} 

void *RTPfun(char * client_addr) 
{ 
    // ... 
    return; 
} 

ошибку:

TCPserver.c: In function ‘main’: 
TCPserver.c:74:5: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default] 
/usr/include/pthread.h:225:12: note: expected ‘void * (*)(void *)’ but argument is of type ‘void * (*)(char *)’ 
+0

Ваш компилятор также должен предупредить вас об использовании 'return;' без выражения в функции с типом возврата, отличным от '' void'. Если этот оператор возврата действительно достигнут, ваша программа имеет неопределенное поведение. – Casey

ответ

1

Вы должны преобразовать указатель обугленного в пустоте один.

#include <pthread.h> 

void *RTPfun(void *client_addr); 

int main(int argc, char *argv[]) 
{ 
    char* client_addr; 
    pthread_t RTPthread; 

    ... 
    ... 

    pthread_create(&RTPthread, NULL, &RTPfun, (void*)client_addr) 
} 

void *RTPfun(void * client_addr) 
{ 
char *something = (char*)client_addr; 
.... 
return; 
} 

Недействительные указатели используются каждый раз, когда нужно передать некоторые данные, и вы не можете заранее знать тип переменной (символ *, целое число * ...) будет. Функция, которую вы даете pthread_create, принимает входной сигнал void *, поэтому вы можете наложить указатель на символ на пустоту и сделать в RTPfun противоположное.

2

Pthread работает с функциями, которые получают void * и return void *.

Вам необходимо изменить параметр вашей функции из char * в void *. Вот альтернатива:

#include <pthread.h> 



void *RTPfun(void *client_addr); 


int main(int argc, char *argv[]) 
{ 
    char* client_addr; 
    pthread_t RTPthread; 

    ... 
    ... 

    pthread_create(&RTPthread, NULL, &RTPfun, client_addr) 
} 



void *RTPfun(void* data) 
{ 
char *client_addr = (char*)data; 
.... 
return; 
} 
Смежные вопросы