首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个函数之间的Malloc可访问性

两个函数之间的Malloc可访问性
EN

Stack Overflow用户
提问于 2013-02-26 01:17:09
回答 1查看 109关注 0票数 1

我正在写一个多线程生产者-消费者问题的变体。我尝试使用队列来存储“生产”的项目,直到它们稍后被“消费”。我的问题是,当消费者线程运行时,它只处理添加到队列中的最新项(而不是队列中最旧的项)。此外,它会重复处理该项目(直到队列本身上的项目数量)。

我想我的问题可能是当我把一个项目推到队列上时,我需要分配一些内存(但不确定这一点)。但是,我需要一种方法来在该项目即将被使用时引用该内存。

不管怎样,这是我的程序的配对版本。我意识到我在这里发布的内容是不完整的(这是一个无限循环),但我只是尝试显示与此问题相关的部分。函数queue_push()和queue_pop()经过了很好的测试,所以我不认为问题出在那里。如果需要我会发更多的帖子。

有人能明白为什么我的消费者线程只处理最新的队列项目吗?谢谢!

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2013-02-26 03:50:10

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15072569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档