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

标签 c tcp pthreads

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

    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);

我认为等待条件是问题所在。考虑到消费者线程没有启动来吃掉队列,服务器显然正在等待一个永远无法满足的条件。我在想我应该更改条件以等待传入的消费者连接,然后启动消费者线程。但在这种方法中这样做似乎很愚蠢。如果我在这种状态下发送消费者请求,则不会发生任何事情。

非常感谢任何建议。我不确定这个设计是否可行。

最佳答案

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

关于c - 使用 TCP 客户端/服务器的生产者/消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596633/

相关文章:

c - 用 C 编写数据库抽象层的好策略

打印同名 C 文件源代码的 C 程序

python - 从 python 发送到 logstash 的 TCP 数据失败

c# - 如何防止套接字/端口耗尽?

c - pthread_join 和 pthread_exit

c - 使用 TDD 的 Hello world 和使用 Eclipse CDT + Jenkins + Maven 的持续集成

c - 如何修改已传递给 C 函数的指针?

c# Sure Fire 检测端口使用情况的方法

c - 简单 Pthread 例程中的 GDB 断点?

c - POSIX 线程与并行性