2016-09-29 2 views
0

) C++에 새롭고 pthread으로 다중 스레드를 만들려고합니다. pthread void * (*)에서 void * (*)로 무효화 된 대화 (

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

가 어떻게이 문제를 해결할 수 있습니다 :이 코드를 실행하면

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

, 그것은 메시지가?

+5

을 호출 할 수 있습니다. C++ 11을 사용한다면 왜'std :: thread'를 사용하지 않을까요? 실제로 모든 곳에서 캐스팅하는 대신 형식 시스템을 사용합니다. – NathanOliver

+0

'pthread_create'에 보낼 수있는 유일한 유형의 함수는'void * create_server (void *)'프로토 타입을 가진 것들입니다. NathanOliver가 언급 한 것처럼'create_server' 함수를 변경하거나'std :: thread'를 개선해야합니다. – Holt

+1

@ NathanOliver C 프로그래머에게 오래된 농담을 상기시켜줍니다. 강력한 타이핑은 키보드에 화를 낼 때입니다. " :) – erip

답변

1

서명해야

void* myThread(void *arg); 

다음 args 인수 pthread_create 호출 :

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

당신이 함수 등을 작성해야합니다 매개 변수로 arg 전달됩니다. r을 myThread으로 바꾸려면 필드를 사용하여 create_server

+0

이렇게하면 [paste.ubuntu] (http://paste.ubuntu.com/23251118/) – Mr2uang

+0

@ Mr2uang과 같은 함수를 만들어야한다는 것을 의미합니다. 주 끝나기 전에 스레드에서'pthread_join'을 호출하는 것도 고려해보십시오. – marcinj

+0

당신이 말했듯이 : 결과는 세그먼트 오류 – Mr2uang

0

함수 정의가 pthread_create가 갖고 싶어하는 유형과 일치하지 않습니다. 1 개의 인수 만 필요하며 그 값은 void*입니다 (함수 void function(void* args)).

당신은 당신이 C++ 11 표준 : 스레드 객체를 사용하는 경우하지만 당신은 그 문제가되지 않습니다 create_server

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

에 변경해야합니다. 여기서 인수 유형과 원하는 인수를 직접 사용할 수 있습니다. 따라서 thread_args 구조체를 정의 할 필요가 없습니다.

void *(*start_routine) (void *) 

하지만 당신은 제공 : 스레드 기능에 대한

+0

'std :: thread'가 두 개의 쓰레드를 병렬로 실행할 수 있습니까? – Mr2uang

+0

@ Mr2uang std :: thread는 개체입니다. 2 개의 스레드를 원할 경우 2 개의 스레드 객체를 인스턴스화 할 수 있습니다. – Hayt

+0

이미'std :: thread'를 시도해 봤습니다. 'std :: thread'를'.join()'에 의해 시작하면'main()'에서 다음 단계를 실행하기 위해 끝나야합니다. – Mr2uang

관련 문제