2014-01-28 37 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 *作为输入,所以你可以把你的char指针指向一个无效的指针,并在RTPfun中做相反的处理。

2

Pthread使用接收void *和返回void *的函数。

您需要将函数的参数从char *更改为v​​oid *。这里有一个替代方案:

#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; 
}