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