2

マルチクライアントサーバーを作ろうとしています。私はこのスレッドを持っています:

void client_thread(int new_socket)
{
    int size;
    char inbuffer[BUF];

    do
    {
        cout << "Waiting for messages: " << endl;
        size = recv(new_socket, inbuffer, BUF, 0);
    } while (true);
}

そしてこの主な手順:

int main()
{
    while (true)
    {
        //waiting for clients
        cout << "Waiting for connections..." << endl;
        new_socket = accept ( create_socket, (struct sockaddr *) &cliaddress, &addrlen );

        //new client connected
        if (new_socket > 0)
        {
            //start thread
            thread(client_thread, new_socket).join();
        }
    }
    return 0;
}

最初のクライアントが接続すると、スレッドが開始され、サーバーはクライアントからのメッセージを待ちます。しかし、サーバーはもはや新しいクライアントを待ちません。どうしてか分かりません。do-whileスレッド関数内の無限ループが原因ですか? スレッドに無限ループが含まれている場合、スレッドがプログラム全体をブロックする場合、スレッドのポイントは何ですか?

4

2 に答える 2

6

スレッドが終了するのを待つため、メイン ルーチンはブロックしますjoin()

ブロックしたくない場合はjoin()、client_thread をブロックしないでください。

この例外は、匿名スレッド オブジェクトの破棄によって発生する可能性があります。if()このスコープ内のすべてのオブジェクトのスコープを離れると、破棄されます。http://en.cppreference.com/w/cpp/thread/thread/~threadからわかるように、デストラクタはterminate(). それを避けるには、 を呼び出すことができますdetach()。の代わりにthread(client_thread, new_socket).join();、と言わなければなりませんthread(client_thread, new_socket).detach();

于 2012-11-06T22:59:19.163 に答える
2

スレッドを作成し、参加するまで参照を保持する必要があります。コードでは、スレッド オブジェクトは作成直後に割り当て解除されるため、すぐに join を呼び出さないとエラーが発生します。

これを適切に実現するための最善の方法は、演算子を使用してオブジェクトをヒープに割り当て、newポインターをリストのどこかに格納することです。スレッドが終了すると、リストからそれ自体を削除するか ("mutex" することを忘れないでください)、または別の専用スレッドにそれを実行させることができます: おそらく、終了する前にメインスレッドを他のすべてのスレッドに参加させることができます。

于 2012-11-06T23:20:51.710 に答える