2

我有一个有趣的(对我来说)问题......有两个线程,一个用于从标准输入捕获数据并通过套接字将其发送到服务器,另一个用于从阻塞套接字接收数据。所以,当服务器没有回复时,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 回答