2012-03-07 13 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

"プロデューサー"と "コンシューマー"は "サーバー"と "クライアント"の名前になっていますか? –

答えて

0

pthread_create()の直後にpthread_join()が呼び出されている可能性があります。これは、プロデューサーが終了するまでメインスレッドがここで停止することを意味します。プロデューサーはコンシューマー接続を受け入れることができないため、キューがいっぱいになると

+0

私はその電話を取り出しました。今では消費者のリクエストを送って返信することができます。この場合、サーバーでpthread_join()を使用する必要がありますか?キューが空であるかフルであるかをクライアントが待つようにしたい。キューが満杯になると、プロデューサは撮影要求を続けます。 – Leif

関連する問題