0

C++ (Linux) でマルチスレッド サーバーを実装しています。私の主な目的は、スレッドを使用して関数を呼び出し、クライアントの詳細を他の関数に送信することです。ここに私のコードスニペットがあります:

while(true)
{

    if((acceptId = accept(sockId,(struct sockaddr*)&clientAddr,(socklen_t *)&address)) == -1)
            perror("Accept:");
    inet_ntop(clientAddr.ss_family,get_ip_address((struct sockaddr *)&clientAddr),ip1, sizeof(ip1));
    clientInfo *cInfo = new clientInfo;
    cInfo->acceptId = acceptId;
    strcpy(cInfo->ip, ip1);
    void *info = cInfo;
    pthread_t thread_request;
    pthread_create(&thread_request,NULL,&Parse::parseRequest_helper,info); // after this while loop is terminating
    //p.parseRequest(info);
    sleep(0);
    cout<<"\nserver: got connection from "<<ip1<<" Port:"<<clientport; // this is not reachable
}

// これは、これを使用する parseRequest() 関数のヘルパー関数です。parseRequest 関数を呼び出しています。

static void * Parse::parseRequest_helper(void *c)    
{

         cout<<"Inside Helper"; // Not coming here
     return ((Parse *)c)->parseRequest(c);
}

void * Parse::parseRequest(void *info)
{

    cout<<"Inside Parse Request";     //Not coming here
    clientInfo *cInfo = (struct clientInfo *)info;
        cout<<cInfo->ip;
}

スレッドを使用しておらず、while ループ内で直接 parseRequest を呼び出している場合、すべて問題ありませんが、スレッドを使用してこの関数を呼び出すと、ブロックされます。提案 ??

4

2 に答える 2

1

あなたのコードを見てください:

static void * Parse::parseRequest_helper(void *c)    
{
     cout<<"Inside Helper"; // Not coming here
     return ((Parse *)c)->parseRequest(c);
}

void *これは、この関数に渡されるパラメーターが へのポインターである場合にのみ意味がありますParse

void * Parse::parseRequest(void *info)
{

    cout<<"Inside Parse Request";     //Not coming here
    clientInfo *cInfo = (struct clientInfo *)info;
        cout<<cInfo->ip;
}

infoこれは、この関数に渡されるパラメーターが へのポインターである場合にのみ意味がありますclientInfo

同じパラメータなので、このコードは意味がありません。Parseへのポインターまたはへのポインターのいずれかにすることができますが、clientInfo両方にすることはできません。

     cout<<"Inside Helper"; // Not coming here

そのコード行に到達していないというあなたの結論は正しくありません。あなたは。endlバッファがフラッシュされないので、わからないだけです。

于 2012-10-12T07:17:40.883 に答える
0

あなたのコードはあなたの状況の詳細を私たちに示すものは何もありませんが、あなたのコメントから私はそれについていくつかのポイントがあります:

あなたが言うよう// after this while loop is terminatingに、あなたのプロダクションコードはここと同じですか、それとも本当にその後ブロックを終了しますか?? 呼び出すときは、スレッドの呼び出しでアクションを実行していることを覚えておいてくださいp.parseRequest(info)。そのため、解析した行の後で、スレッドを使用する場合、行 ( pthread_create(...)) の後、指定されたスレッドはイベント開始されない可能性があり、OS によって実行されるようにスケジュールされたスレッド後で解析が行われると考えるべきではありません。

// this is not reachableは実行されるべきではないと思いますか? またはこれは実行時のコードの動作ですか? いずれにせよ、pthread_createすぐに戻り、後で実行の別のスレッドでジョブを実行するため、コードではほとんどすぐに呼び出しsleep(0)て、指定された行に確実に到達します!!

sleep(0)スレッドを開始または完了させることを意図している理由は何ですか?? いずれにせよ、OS は内部アルゴリズムに基づいてスレッドをスケジュールするため、その後sleep(0)、スレッドの実行は保留中のままになる可能性があります!! スレッドの開始/停止を確実にしたい場合は、スレッドとメインスレッドの間で同期メカニズム (mutex など) を使用する必要があります。

于 2012-10-12T05:47:08.113 に答える