0

私はCでソケットプログラミングを行っています。本質的に、別のスレッドで無期限のリスニングループを実行するサーバーが必要であり、新しい接続を受け入れるたびに、クライアントの要求を処理するために新しいクライアントスレッドを作成する必要があります。

以下に、ポート番号を宣言し、関数createListenThreadを呼び出すメイン関数があります。この関数は新しいスレッドを作成し、関数listenLoopを呼び出します。

int main(int argc, char *argv[])
{
    int client_port = 6000;
    createListenThread(client_port);
}

void createListenThread(int listen_port)
{   
    pthread_t listen_tid;

    printf("In createListenThread\n");  
    // listenLoop(&listen_port);

    if(pthread_create(&listen_tid, NULL, listenLoop, &listen_port) != 0)
        socketError("Could not create thread\n");       

}

void *listenLoop(void *arg)
{
    pthread_detach(pthread_self());

        int listen_socket, listen_port, *client_socket, struct_size;
    struct sockaddr_in client_addr; 
    pthread_t client_tid;

    listen_port = *((int *)arg);        
    listen_socket = createSocket(listen_port);
    struct_size = sizeof(struct sockaddr_in);

    while(1)
    {  
        printf("In ListenLoop\n");
            client_socket = malloc(sizeof(int));
            *client_socket = -1;
            *client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &struct_size);

            printf("Received connection request from (%s , %d)\n",
            inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

            pthread_create(&client_tid, NULL, starterFunction, client_socket);
    }

    close(listen_socket);
} 

私の問題は、サーバーを実行するたびに、「In ListenThread」「In ListenLoop」だけが出力されないことです。fprintf(stdout, "In ListenLoop") と fflush(stdout) も試しましたが、ステートメントはまだ出力されません。コメントアウトすると:

if(pthread_create(&listen_tid, NULL, listenLoop, &listen_port) != 0)
         socketError("Could not create thread\n");

次のように ListenLoop を呼び出すだけです。

listenLoop(&listen_port);

両方の print ステートメントが表示されます。スレッドを作成して ListenLoop 関数を呼び出す方法に明らかな間違いはありますか? 関数 ListenLoop が実行されたことはありますか?

編集: gdb でプログラムを実行すると、次のように出力されました。

In createListenThread
[New Thread 0xb7e30b70 (LWP 10024)]   
[Thread 0xb7e30b70 (LWP 10024) exited]
[Inferior 1 (process 10021) exited normally]

スレッドが終了するのはなぜですか??

4

2 に答える 2

2

問題は、 main 関数が を呼び出した直後に戻ることcreateListenThreadです。スレッド関数が終了するまで待つ必要がpthread_joinあります。createListenThreadそうしないと、スレッド関数が終了する前にプログラムが終了する可能性があります。スレッドでの呼び出しpthread_joinは、スレッド関数が戻るまで待機するため、main()戻る前に実行する機会が確実に得られます。

于 2013-10-20T13:07:43.010 に答える
0

main の上ですべての関数を宣言することを願っています...しかし、実際listenLoopにはメインスレッドで呼び出す必要があります。それ以外の場合は、ループを実行するスレッドを作成し、メイン スレッドがそれを受動的に待機します。また、引数の受け渡しやスレッドの待機などに煩わされることもありません。

listenLoop何も返さないため、真の void になり、もはや void * ではない可能性があります。

プロセスを fork する場合は、init プロセスによってすぐに採用されるデーモン プロセスを作成する正しい方法であるため、理にかなっていますが、スレッドの場合はまったく役に立ちません。

于 2014-07-29T17:34:05.000 に答える