使用TCP客户端/服务器的生产者/消费者

使用TCP客户端/服务器的生产者/消费者,c,tcp,pthreads,C,Tcp,Pthreads,该服务器旨在成为多线程服务器,通过TCP在生产者或消费者连接上产生新线程。我的问题是,一旦生产者客户机填满队列,我就会陷入等待状态。此代码段显示服务器对生产者连接的处理。生产者发送的请求格式为PUT(项) 您可以看到,我正在创建一个新线程,处理填充队列/检测队列是否为空的任务。生产商内部的代码: queue *fifo; int i=atoi(item[0]); char*fullmsg="Full\n"; fifo = (queue *)q; pth

该服务器旨在成为多线程服务器,通过TCP在生产者或消费者连接上产生新线程。我的问题是,一旦生产者客户机填满队列,我就会陷入等待状态。此代码段显示服务器对生产者连接的处理。生产者发送的请求格式为PUT(项)

您可以看到,我正在创建一个新线程,处理填充队列/检测队列是否为空的任务。生产商内部的代码:

    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);
我认为等待条件是问题所在。服务器显然在等待一个永远无法满足的条件,因为消费者线程没有开始占用队列。我在想,我应该改变条件,等待传入的使用者连接,然后启动一个使用者线程。但在这种方法中这样做似乎很愚蠢。如果在此状态下发送消费者请求,则不会发生任何事情


如有任何建议,我们将不胜感激。我不确定这个设计是否可行

您的问题似乎是,您在
pthread\u create()
之后立即调用
pthread\u join()
,这意味着主线程在此停止,直到生产者退出-它永远无法接受消费者连接,因此一旦队列已满,生产者就无法取得进展。

生产者和消费者它们应该被命名为“服务器”和“客户端”,不是吗?我打了那个电话,现在我可以发送消费者请求并得到回复。在这种情况下,我应该在服务器中使用pthread_join()吗?如果队列为空或已满,我希望客户端等待。当队列已满时,制作人继续拍摄请求。
    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);