Сервер предназначен для многопоточного сервера, который генерирует новые потоки либо через соединение производителя, либо с потребителем через 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);
Я считаю, что условие ожидания является проблемой. Сервер, очевидно, ждет условия, которые никогда не могут быть выполнены, учитывая, что потребительский поток не начал переваривать очередь. Я думал, что я должен изменить условие, чтобы дождаться входящего подключения к потребителю, а затем запустить потребительский поток. Но тогда это кажется глупым в этом методе. Если я отправлю запрос потребителя, в этом состоянии ничего не произойдет.
Любые предложения приветствуются. Я не уверен, возможен ли этот проект.
Предполагается, что «Производитель» и «потребитель» называются «сервер» и «клиент», не так ли? –