2016-09-29 2 views
0

Я новичок в C++ и пытаюсь создать несколько потоков с помощью pthread.pthread C++ неверный разговор из void * (*) в void * (*) (void *)

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

Как я могу это исправить?

+5

Если у вас есть C++ 11, почему бы не использовать 'std :: thread'? На самом деле он использует систему типов, а не везде. – NathanOliver

+0

Единственный тип функции, которую вы можете отправить в 'pthread_create', - это те, у которых есть прототип' void * create_server (void *) '. Вам нужно изменить функцию 'create_server' или лучше нас' std :: thread', как упоминалось NathanOliver. – Holt

+1

@NathanOliver Напоминает мне о старой шутке «программисту С, сильная печать, когда он сердится на свою клавиатуру». :) – erip

ответ

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 paramete r до myThread, вы можете использовать его поля для звонка create_server

+0

Вы имеете в виду, что я должен создать функцию, подобную этой [paste.ubuntu] (http://paste.ubuntu.com/23251118/) – Mr2uang

+0

@ Mr2uang yes, также подумайте о вызове 'pthread_join' в вашем потоке до начала работы. – marcinj

+0

Я следовал так, как вы сказали: результат сегментных сбоев – Mr2uang

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 станд :: нить. Там вы можете напрямую использовать тип аргумента и любое количество аргументов, которые вам нравятся. Поэтому вам не нужно определять структуру thread_args.

+0

Может ли 'std :: thread' запускать два потока параллельно? – Mr2uang

+0

@ Mr2uang std :: thread - это объект. Если вы хотите 2 потока, вы можете создать два объекта потока. – Hayt

+0

Я уже пробовал 'std :: thread' раньше. когда я запускаю 'std :: thread'' .join() ', он должен закончить выполнение следующего шага в' main() '. – Mr2uang

Смежные вопросы