【问题标题】:Sockets and multithreading套接字和多线程
【发布时间】:2011-02-11 19:18:46
【问题描述】:

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

【问题讨论】:

    标签: c++ linux sockets multithreading recv


    【解决方案1】:

    您在对NVT::recv 的调用中持有nvtMutex。由于两个线程都需要锁定互斥体以使其通过迭代,直到NVT::recv 返回另一个线程才能进行。

    如果不知道这个NVT 类的详细信息,就不可能知道您是否可以在调用NVT::recv 之前安全地解锁互斥锁,或者这个类是否没有提供您需要的适当线程安全。

    【讨论】:

      【解决方案2】:

      如果您的代码实现正确,recv 只会阻塞调用它的线程。

      如果您不是这种情况,请显示演示问题的最小代码示例。

      【讨论】:

        猜你喜欢
        • 2016-03-16
        • 2013-01-19
        • 2012-09-07
        • 1970-01-01
        • 2017-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多