gpt4 book ai didi

c - Dining Philosophers in C 内存泄漏

转载 作者:行者123 更新时间:2023-12-01 23:49:12 26 4
gpt4 key购买 nike

我正在尝试使用资源层次结构解决方案在 C 语言中实现 Dining Philosophers。当我使用 valgrind 时,一切正常。不幸的是,当我使用控制台完成此操作时,我得到了随机的 seqfaults。一次我的程序会成功,一次它会在一开始就崩溃。如果有人能指出我哪里做错了以及为什么 100% 成功,我将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

#define NUM_PHILOSPHERS 5

sem_t forks[NUM_PHILOSPHERS];
void *philosopher(void *param){
printf("Thread created!");
int *id = (int *)param;
int L = 0;
sem_t* Myforks[2];
int par = *id;
if(par == 4){
Myforks[0] = &forks[4];
Myforks[1] = &forks[0];
}else{
Myforks[0] = &forks[par];
Myforks[1] = &forks[par+1];
}
while(L!=5){
printf("Eat spaghetti!",*id);
sem_wait(Myforks[0]);
sem_wait(Myforks[1]);
//.....
printf("EAT spaghetti!",*id);
sem_post(Myforks[1]);
sem_post(Myforks[0]);
L=L+1;
}
pthread_exit(NULL);
}

int main(){
int i;
pthread_t threads[NUM_PHILOSPHERS];

for(i = 0; i < NUM_PHILOSPHERS; i++)
sem_init(&forks[i], 0, 1);
for(i = 0; i < NUM_PHILOSPHERS; i++)
pthread_create(&threads[i], NULL, philosopher, (void *)&i);
return 0;
}

最佳答案

int i;

...

for(i = 0; i < NUM_PHILOSPHERS; i++)
pthread_create(&threads[i], NULL, philosopher, (void *)&i);
^^

将指针传递给局部变量是行不通的。您将相同的地址传递给所有线程,因此存在固有的竞争条件。您将它们指向 i 的指针,它们几乎立即递增 i。当他们访问 *param 时,他们会读到什么值?谁知道!

您需要创建一个包含 NUM_PHILOSPHERS (sic) 个槽的数组,并将不同的地址传递给每个线程。您还需要确保当 main() 退出时该数组不会被销毁——即,使数组成为全局或静态的,而不是本地的。

关于c - Dining Philosophers in C 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27367993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com