該服務器旨在成爲一個多線程服務器,它通過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);
我相信等待條件是問題所在。考慮到消費者線程沒有開始佔用隊列,服務器顯然正在等待一個永遠不能滿足的條件。我在想,我應該改變條件以等待傳入的消費者連接,然後啓動消費者線程。但在這種方法中這樣做似乎很愚蠢。如果我在此狀態下發送消費者請求,則不會發生任何情況。
任何建議,非常感謝。我不確定這種設計是否可行。
「生產者」和「消費者」應該被命名爲「服務器」和「客戶」,不是嗎? – 2012-03-07 06:10:58