C pthread_创建错误

C pthread_创建错误,c,C,我有 这只是整个剧本的一部分。每次我试图编译它时,我都会得到警告:传递'pthread_create'的参数4会使指针从整数变成不带强制转换的指针 知道为什么会这样吗?提前感谢。参数4是client\u sock,它是传递给accept\u request的参数。它应该是一个指针,但由于它只是传递给您的函数,所以它可以是一个整数,而不会造成任何伤害。只需将其强制转换为void*即可删除警告 另一方面,第三个参数accept\u request应该是接受void*并返回void*的函数指针。您不应

我有

这只是整个剧本的一部分。每次我试图编译它时,我都会得到
警告:传递'pthread_create'的参数4会使指针从整数变成不带强制转换的指针


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

参数4是
client\u sock
,它是传递给
accept\u request
的参数。它应该是一个指针,但由于它只是传递给您的函数,所以它可以是一个整数,而不会造成任何伤害。只需将其强制转换为
void*
即可删除警告

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

    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");
    }

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

void *accept_request( void *client_sock );
然后在accept_request(顺便说一句,它应该是一个带指针的函数)中,您将执行以下操作:

if (pthread_create(&newthread , NULL, (void * ) accept_request, &client_sock) != 0) {
将int转换为(void*)可能不可移植(因为int和void*的数据大小不一定相同)。当然,它可能在您当前的编译器上工作

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

void *accept_request( void *client_sock_addr ) {
   int client_sock = *((int*) client_sock_addr);
}
然后在函数中执行以下操作:

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");
}

这只是因为您不尊重
pthread\u 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);
}

如您所见,第三个参数应该是一个函数指针,因此正确的转换应该是
(void*(*)(void*)
client_sock
,这将是
start_routine
的参数,您必须采用这样的地址
&client_sock

int client_sock=-1;我不知道为什么,但当我将&client_sock而不是client_sock放入时,整个套接字都停止工作。有什么想法吗?这个变化带来了一个新问题。没有任何东西可以确保指针及其指向的数据在线程使用它之前保持有效。解决此问题的一些方法:malloc参数块并将其释放到线程中,让线程发出信号,表明已使用参数完成此操作,并在使其无效之前等待。通常,最好使用
pthread\u t
对象将参数分组到
struct
中的线程中。当您与线程连接时,您可以处理
struct
或重用它或其他任何东西。
int pthread_create(pthread_t *restrict thread,
              const pthread_attr_t *restrict attr,
              void *(*start_routine)(void*), void *restrict arg);