2010-04-24 158 views
2

我有一個有趣的(對我來說)問題...有兩個線程,一個用於從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(); 
    } 
} 

回答

3

您在撥打NVT::recv的電話中持有nvtMutex。由於兩個線程都需要鎖定互斥鎖才能通過迭代,直到NVT::recv返回其他線程無法進展。

不知道這個NVT類的細節,在調用NVT::recv之前,或者如果這個類沒有提供您需要的正確線程安全性,就不可能知道您是否可以安全地解鎖互斥鎖。

+0

非常感謝!所以愚蠢的錯誤... – 2010-04-24 06:54:40

1

如果您的代碼正確實施,則recv只會阻止調用它的線程。

如果情況並非如此,請展示最小的代碼示例,以說明問題。

+0

http://pastebin.com/deQXUEPA – 2010-04-24 06:35:07