pthread c ++从void *(*)到void *(*)(void *)的无效对话

时间:2016-09-29 13:18:10

标签: c++ c++11

我是C++中的新用户并尝试使用pthread创建多个主题。

typedef struct thread_args{
    int &sockfd;
    struct sockaddr_in &serv_addr;
    int size_serv_addr;
    socklen_t &clilen;
    int &newsockfd;
};

void create_server(int &sockfd, struct sockaddr_in &serv_addr, int size_serv_addr, socklen_t &clilen, int &newsockfd){
}

int main(int argc, char *argv[])
{
     int sockfd, newsockfd;
     socklen_t clilen;

     pthread_t t1;
     struct sockaddr_in serv_addr, cli_addr;
     struct thread_args *args;
     args->clilen = clilen;
     args->newsockfd = newsockfd;
     args->serv_addr = serv_addr;
     args->size_serv_addr = sizeof(serv_addr);
     args->sockfd = sockfd;


     pthread_create(&t1, NULL, create_server, &args);
     printf("hello abc");
     return 0; 
}

当我运行此代码时,它会显示一条消息:

error:/bin/sh -c 'make -j 4 -e -f   error: invalid conversion from 'void* (*)(int&, sockaddr_in&, int, socklen_t&, int&) {aka void* (*)(int&, sockaddr_in&, int, unsigned int&, int&)}' to 'void* (*)(void*)' [-fpermissive]
      pthread_create(&t1, NULL, create_server, &args);

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您的线程功能的签名应该是:

void *(*start_routine) (void *)

但你提供:

void create_server(int &sockfd, struct sockaddr_in &serv_addr, int size_serv_addr, socklen_t &clilen, int &newsockfd)

你应该创建一个像:

这样的函数
void* myThread(void *arg);

然后args调用中的pthread_create参数将作为arg参数传递给myThread,您可以使用其字段来调用create_server

答案 1 :(得分:0)

您的函数定义与pthread_create想要的类型不匹配。它只需要1个参数,即void*(所以函数void function(void* args))。

您需要将create_server更改为

void create_server(void* voidArgs) {
    thread_args* args = static_cast<thread_args*>(voidArgs);
    //...
}

如果使用c ++ 11 std :: thread对象,则不会出现这些问题。在那里,您可以直接使用参数类型和您喜欢的任意数量的参数。所以你不必定义thread_args结构。