サーバは、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);
私は待ち状態が問題だと思います。消費者スレッドがキューを食べ始めていないことを考慮すると、サーバーは明らかに満たされない状態を待っています。私は、受信コンシューマ接続を待ってからコンシューマスレッドを開始するように条件を変更する必要があると考えていました。しかし、この方法ではそうするのは愚かなようです。この状態で消費者の要求を送信すると、何も起こりません。
ご意見をいただければ幸いです。このデザインが実現可能かどうかはわかりません。
"プロデューサー"と "コンシューマー"は "サーバー"と "クライアント"の名前になっていますか? –