2012-03-07 45 views
0

該服務器旨在成爲一個多線程服務器,它通過TCP生成者或消費者連接產生新線程。我的問題是,一旦生產者客戶端填滿了隊列,我會陷入等待狀態。該片段顯示服務器對生產者連接的處理。生產者發送請求的格式是PUT(項)使用TCP客戶機/服務器的生產者/消費者

reqline[0] = strtok (mesg, " \t\n"); 


if (strncmp(reqline[0], "PUT\0", 4)==0) 
      { 
      item[0]=strtok(NULL," \t\n"); 
      pthread_create (&pro, NULL, producer, fifo); 
      pthread_join (pro, NULL); 


      } 

所以你可以看到我創建一個新的線程,它處理填充隊列/檢測時,它是空的工作。生產者代碼:

queue *fifo; 
    int i=atoi(item[0]); 
    char*fullmsg="Full\n"; 

    fifo = (queue *)q; 

    pthread_mutex_lock (fifo->mut); 

     while (fifo->full) { //the problem block 

       printf ("producer: queue FULL.\n"); 
       send(conn_s, fullmsg,strlen(fullmsg),0); 
       pthread_cond_wait (fifo->notFull, fifo->mut); 
      } 

      queueAdd (fifo, 0); 
      pthread_mutex_unlock (fifo->mut); 
      pthread_cond_signal (fifo->notEmpty); 

我相信等待條件是問題所在。考慮到消費者線程沒有開始佔用隊列,服務器顯然正在等待一個永遠不能滿足的條件。我在想,我應該改變條件以等待傳入的消費者連接,然後啓動消費者線程。但在這種方法中這樣做似乎很愚蠢。如果我在此狀態下發送消費者請求,則不會發生任何情況。

任何建議,非常感謝。我不確定這種設計是否可行。

+0

「生產者」和「消費者」應該被命名爲「服務器」和「客戶」,不是嗎? – 2012-03-07 06:10:58

回答

0

你的問題似乎是你在pthread_create()之後立即調用pthread_join(),這意味着主線程停在這裏直到生產者退出 - 它永遠不會接受消費者連接,所以生產者不能進步一旦隊列滿了。

+0

我拿出了那個電話,現在我可以發送消費者請求並獲得答覆。在這種情況下,我應該在服務器中使用pthread_join()嗎?我希望客戶端在隊列空或滿時等待。當隊列滿時製片人會繼續拍攝請求。 – Leif 2012-03-07 16:42:48