Производитель / Потребитель, использующий TCP клиент / сервер - PullRequest
0 голосов
/ 07 марта 2012

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

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

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

1 Ответ

0 голосов
/ 07 марта 2012

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

...