pthread_create错误

时间:2010-08-15 00:27:33

标签: c

我有

    client_sock = accept(server_sock, (struct sockaddr *)&client_name, &client_name_len);        
    if (pthread_create(&newthread , NULL, (void * ) accept_request, client_sock) != 0) {
            perror("pthread_create");
    }

这只是整个脚本的一部分。每当我尝试编译它时,我都会得到warning: passing argument 4 of 'pthread_create' makes pointer from integer without a cast

知道为什么会这样吗?提前谢谢。

3 个答案:

答案 0 :(得分:5)

参数4是client_sock,这是传递给accept_request的参数。它应该是一个指针,但由于它只是传递给你的函数,它可以是一个整数而不会造成任何伤害。只需将其转换为void*即可删除警告。

另一方面,第三个参数accept_request应该是一个接受void*并返回void*的函数指针。您不应该将其强制转换为void*。最好将accept_request的声明更改为符合规范。

void *accept_request( void *client_sock );

答案 1 :(得分:3)

我假设client_sock被定义为“int client_sock”。在这种情况下,您应该写下以下内容:

if (pthread_create(&newthread , NULL, (void * ) accept_request, &client_sock) != 0) {

然后在accept_request(其中,顺便说一下,应该是一个带指针的函数),你会这样做:

void *accept_request( void *client_sock_addr ) {
   int client_sock = *((int*) client_sock_addr);
}

将int转换为(void *)可能不可移植(因为i​​nt和void *的数据大小不一定相同)。当然,它可能适用于您当前的编译器......

感谢jiles指出这一点:根据代码的其余部分,该地址的值可能会发生变化(例如,如果在accept构造周围有一个循环,并且在创建一个线程之前有2个接受到达)。最好的方法是使用malloc分配内存,如

int *client_sock_addr=malloc(sizeof(int)); 
*client_sock_addr = accept(server_sock, (struct sockaddr *)&client_name, &client_name_len);        
if (pthread_create(&newthread , NULL, (void * ) accept_request, client_sock_addr) != 0) {
        perror("pthread_create");
}

然后在函数中执行:

void *accept_request( void *param ) {
   int *client_sock_addr = (int*) client_sock_addr;
   int client_sock = *client_sock_addr;

   // Before exiting the thread
   free(client_sock_addr);
}

答案 2 :(得分:0)

这只是因为您不尊重pthread_create

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

正如你所看到的那样,第三个参数应该是一个函数指针,所以正确的强制转换是(void *(*)(void*)),而client_sockstart_routine的参数,你必须采用像&client_sock

这样的地址