2

私には興味深い(私にとって)問題があります... 2つのスレッドがあります。1つはstd入力からデータをキャプチャしてソケットを介してサーバーに送信するためのもので、もう1つはブロッキングソケットからデータを受信するためのものです。したがって、サーバーからの応答がない場合、recv()呼び出しは無期限に待機しますよね?ただし、呼び出し元のスレッドだけをブロックするのではなく、プロセス全体をブロックします。なぜこのことが起こるのですか?

boost::mutex     nvtMutex;
boost::mutex    strMutex;
boost::mutex    quitMutex;
bool        quit = false;

void *processServerOutput(void *arg)
{
    NVT *nvt = (NVT*)arg;
    while(1)
    {
        // Lock the quitMutex before trying to access to quit variable
        quitMutex.lock();
        if(quit)
        {
            quitMutex.unlock();
            pthread_exit(NULL);
        }
        else
            quitMutex.unlock();

        // Receive output from server
        nvtMutex.lock();
        nvt->receive();
        cout << Util::Instance()->iconv("koi8-r", "utf-8", nvt->getOutBuffer());
        nvtMutex.unlock();

        // Delay
        sleep(1);
    }
}

void *processUserInput(void *arg)
{
    NVT *nvt = (NVT*)arg;

    while(1)
    {
        // Get user's input
        //cin.getline(str, 1023);

        sleep(3);
        strcpy(str, "hello");

        // If we type 'quit', exit from thread
        if(strcmp(str, "quit") == 0)
        {
            // Lock quit variable before trying to modify it
            quitMutex.lock();
            quit = true;
            quitMutex.unlock();

            // Exit from thread
            pthread_exit(NULL);
        }

        // Send the input to server
        nvtMutex.lock();
        nvt->writeUserCommand(Util::Instance()->iconv("utf-8", "koi8-r", str));
        nvt->send();
        nvtMutex.unlock();
    }
}
4

2 に答える 2

3

あなたはnvtMutexへの呼び出しの内側を保持していますNVT::recv。両方のスレッドが反復を通過するためにミューテックスをロックする必要があるため、NVT::recvリターンが返されるまで、もう一方のスレッドは進行できません。

このクラスの詳細NVTを知らなければ、呼び出す前にミューテックスのロックを安全に解除できるかどうか、NVT::recvまたはこのクラスが必要な適切なスレッドセーフを提供しないかどうかを知ることは不可能です。

于 2010-04-24T06:41:22.990 に答える
1

コードが正しく実装されている場合、recvそれを呼び出すスレッドのみをブロックします。

そうでない場合は、問題を示す最小限のコードサンプルを示してください。

于 2010-04-24T06:23:18.260 に答える