套接字和multithreading

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

你在调用NVT::recv拿着nvtMutex 。 由于两个线程都需要锁定互斥锁才能通过迭代,直到NVT::recv返回其他线程无法进展。

不知道这个NVT类的细节,在调用NVT::recv之前,或者如果这个类没有提供你需要的正确的线程安全性,就不可能知道你是否可以安全地解锁这个互斥体。

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

如果情况并非如此,请展示演示问题的最小代码示例。