2012-03-07 2 views
0

Сервер предназначен для многопоточного сервера, который генерирует новые потоки либо через соединение производителя, либо с потребителем через 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); 

Я считаю, что условие ожидания является проблемой. Сервер, очевидно, ждет условия, которые никогда не могут быть выполнены, учитывая, что потребительский поток не начал переваривать очередь. Я думал, что я должен изменить условие, чтобы дождаться входящего подключения к потребителю, а затем запустить потребительский поток. Но тогда это кажется глупым в этом методе. Если я отправлю запрос потребителя, в этом состоянии ничего не произойдет.

Любые предложения приветствуются. Я не уверен, возможен ли этот проект.

+0

Предполагается, что «Производитель» и «потребитель» называются «сервер» и «клиент», не так ли? –

ответ

0

Проблема заключается в том, что вы вызываете pthread_join() сразу после pthread_create(), что означает, что основной поток останавливается здесь до выхода производителя - он никогда не может принимать потребительское соединение, поэтому производитель не может добиться прогресса как только очередь заполнена.

+0

Я вынул этот звонок, и теперь я могу отправить запрос потребителя и получить ответ. Должен ли я использовать pthread_join() на сервере вообще в этом случае? Я хочу, чтобы клиенты дождались, если очередь пуста или заполнена. Производитель продолжает снимать запросы, когда очередь заполнена. – Leif

Смежные вопросы