该服务器旨在成为多线程服务器,通过TCP通过生产者或消费者连接生成新线程。我的问题是,一旦生产者客户端填满队列,我就会陷入等待状态。此代码片段显示服务器对生产者连接的处理。生产者发送的请求的格式为PUT(项目)
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_join()
之后立即调用pthread_create()
,这意味着主线程在此处停止,直到生产者退出为止-它永远无法接受使用者连接,因此生产者无法取得进展一旦队列已满。
关于c - 使用TCP客户端/服务器的生产者/消费者,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9596633/