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



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

    reqline[0] = strtok (mesg, " tn");

 if ( strncmp(reqline[0], "PUT", 4)==0 )
           {
            item[0]=strtok(NULL," tn");
            pthread_create (&pro, NULL, producer, fifo);
            pthread_join (pro, NULL);

            }

所以你可以看到我正在创建一个新的线程,它处理填充队列/检测队列何时为空的工作。生产者内部的代码:

    queue *fifo;
    int i=atoi(item[0]);
    char*fullmsg="Fulln";
    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_create()之后立即调用pthread_join(),这意味着主线程在生产者退出之前会停止在这里——它永远无法接受消费者连接,因此一旦队列满了,生产者就无法取得进展。

最新更新