2016-09-29 9 views
0

私はC++で新しく、pthreadで複数のスレッドを作成しようとしています。pthread 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'関数を変更するか、NathanOliverで述べたように' std :: thread'を改善する必要があります。 – Holt

+1

@ NathanOliver Cプログラマーには「キーボードに怒っているときに強い入力がある」という古いジョークを思い出させます。 :) – 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) 

あなたのような機能を作成する必要があります。pthread_createコールにargsに、引数を

void* myThread(void *arg); 

をパラメータ: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のstd ::スレッドオブジェクトを使用する場合かかわらず、あなたはそれらの問題を持っていませんcreate_server

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

に変更する必要があります。そこでは、引数の型と任意の数の引数を直接使用できます。したがって、thread_args構造体を定義する必要はありません。

+0

'std :: thread'は2つのスレッドを並列に実行できますか? – Mr2uang

+0

@ Mr2uang std :: threadはオブジェクトです。 2つのスレッドが必要な場合は、2つのスレッドオブジェクトをインスタンス化できます。 – Hayt

+0

私はすでに前に 'std :: thread'を試しました。 'std :: thread'を' .join() 'で起動すると、' main() 'の次のステップを実行するために終了しなければなりません。 – Mr2uang

関連する問題