Доступность Malloc между двумя функциями

Я пишу вариант проблемы производителя-потребителя с многопоточным потоком. Я пытаюсь использовать очередь для хранения «произведенных» элементов до тех пор, пока они не будут «поглощены» позже. Моя проблема заключается в том, что при запуске потребительского потока обрабатывается только последний элемент, добавленный в очередь (а не самый старый элемент в очереди). Кроме того, он обрабатывает этот элемент повторно (вплоть до количества элементов в самой очереди).

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

Во всяком случае, вот спаренная версия моей программы. Я понимаю, что то, что я публикую здесь, является неполным (это бесконечный цикл), но я пытаюсь просто показать часть, которая имеет отношение к этой проблеме. Функции queue_push() и queue_pop() хорошо протестированы, поэтому я не думаю, что проблема там. При необходимости отправлю больше.

Может ли кто-нибудь понять, почему мой потребительский поток обрабатывает только новый элемент очереди? Спасибо!

sem_t mutex;
queue q;

FILE* inputFPtr[10];

char host_in[BUFFERSIZE];
char host_out[BUFFERSIZE];

void* p(void* inputFile) {

    while (fscanf(inputFile, INPUTFS, host_in) > 0) 
    {
        sem_wait(&mutex);
        queue_push(&q, host_in); //this function pushes the hostname onto the back of the queue   
        fprintf(stdout, "Produced: %d) %s\n", i, host_in);
        sem_post(&mutex);        
     }

    fclose (inputFile);
}

void* c() {

    while (TRUE)
    {        
        sem_wait(&mutex);
        sprintf(hostname_out, "%s", (char *) queue_pop(&q));
        printf("%s\n", host_out);
        sem_post(&mutex);
    }

}

int main (int argc, char* argv[]) {

    int i;
    pthread_t *th_in[argc-2];
    pthread_t *th_out[2];

    for (i = 0; i < (argc-2); i++) {
        th_in[i] = (pthread_t *) malloc(sizeof(pthread_t)); 
        inputFPtr[i] = fopen(argv[i+1], "r");
        pthread_create (th_in[i], NULL, p, inputFPtr[i]);
    }

    for (i = 0; i < 2; i++) {
        th_out[i] = (pthread_t *) malloc(sizeof(pthread_t));
        pthread_create (th_out[i], NULL, c, null);
    }

    for (i = 0; i < (argc - 2); i++) {
        pthread_join(*th_in[i], 0);
        free(th_in[i]);
    }

    for (i = 0; i < (2); i++) {
        pthread_join(*th_out[i], 0);
        free(th_out[i]);
    }

    return EXIT_SUCCESS;
}
1
nl ja de
Извините, я не понял, что удалил свой пост. Я пытался вставить дополнительный код. Не означает нарушать какие-либо правила SO или неуважение к любому из респондентов.
добавлено автор Alex, источник
Кстати, я обнаружил свою проблему. Код для функции очереди (не размещен здесь) был написан на том, что очередь будет содержать указатели на строки, а не сами строки. Задача решена.
добавлено автор Alex, источник
Do not калечат ваш вопрос, например, удалив код, о котором вы просили. Не изменяйте свой вопрос, чтобы сделать существующие ответы бессмысленными. Если вам необходимо изменить свой вопрос (что является законным действием), соблюдайте усилия тех, кто пытался вам помочь.
добавлено автор Jonathan Leffler, источник
Uhm, как это часто бывает, «важный» код, такой как «queue_push» и «queue_pop», как представляется, отсутствует. Бьюсь об заклад, вот где код идет не так ...
добавлено автор Mats Petersson, источник
Я не понимаю, почему ваш потребительский поток обрабатывает только новый элемент очереди, потому что я не вижу ваш код. ;)
добавлено автор Nik Bougalis, источник
Нам нужен полный нерабочий (;)) код для диагностики проблемы ... я не вижу никакой проблемы с указанным выше кодом
добавлено автор Davide Berra, источник

1 ответы

Вы забыли отправить вам код. Однако из вашего описания кажется, что все члены очереди указывают на тот же блок памяти. Вот почему все ваши всплывающие подсказки имеют один и тот же элемент. Ответ на ваш вопрос - ДА. Вам необходимо выделить память для каждого из предметов и освободить ее после того, как она «будет потреблена».

Попробуйте опубликовать код для более конкретных ответов ...

0
добавлено
Извини за это. Я пытался переписать свой код с некоторыми изменениями, и я, кажется, полностью удалил его. Виноват.
добавлено автор Alex, источник
Ответ на его вопрос: возможно - если у него есть ограниченная очередь со всем предопределенным хранилищем, ему может не понадобиться malloc или free что-либо , Нам нужен код, чтобы обеспечить какое-либо понимание.
добавлено автор Nik Bougalis, источник
Да, я знаю. Это просто предположение в соответствии с симптомами, описанными @ usr55410.
добавлено автор eyalm, источник