c-两个功能之间的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) %sn", i, host_in);
        sem_post(&mutex);        
     }
    fclose (inputFile);
}
void* c() {
    while (TRUE)
    {        
        sem_wait(&mutex);
        sprintf(hostname_out, "%s", (char *) queue_pop(&q));
        printf("%sn", 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;
}

您忘记发布代码了。然而,根据您的描述,似乎所有队列成员都指向同一个内存块。这就是为什么你所有的pop结果都是相同的项目。你的问题的答案是肯定的。您需要为每个项目分配内存,并在"消耗"后释放内存。

尝试发布一些代码以获得更具体的答案。。。

相关内容

  • 没有找到相关文章

最新更新