gpt4 book ai didi

c - futex 工具返回了意外的错误代码并中止

转载 作者:太空宇宙 更新时间:2023-11-04 01:48:22 25 4
gpt4 key购买 nike

我正在尝试使用信号量解决哲学家就餐问题。哲学家先拿起左边的 fork ,然后拿起右边的 fork ,吃完后放下。我正在使用 5 个线程一个用于每个哲学家和 5 个信号量一个用于每根筷子来实现这一点。需要由父级执行死锁检查并在发现时打破死锁。当我刚刚运行哲学家思考和饮食的循环时,程序崩溃并出现错误futex 工具返回了一个意外的错误代码。中止。我没有获得有关如何调试此错误的任何信息。

哲学家的线索如下

void *Philospoher_behaviour(void *param){
int id = *(int *)param; // assigns a ID to the Phil
int state; // hungry , thinking, eating
// first the philopher thinks
while(1) {
state = THINKING;
float time = (float)rand()/RAND_MAX;
printf("Philosopher %d starts THINKING for %f\n",id,time);
sleep(time);
// the phil goes hungrg
state = HUNGRY;
printf("Philosopher %d is now HUNGRY\n",id);
// first wait for left
sem_wait(&chopsticks[id]);
printf("Philosopher %d grabs chopstick %d to this LEFT\n",id,id);

// got left chopstick
sem_wait(&chopsticks[(id+1)%5]);
printf("Philosopher %d grabs chopstick %d to this RIGHT\n",id,(id+1)%5);

// got the right chopstick
state = EATING;
time = (float)rand()/RAND_MAX;
printf("Philosopher %d starts EATING for time %f\n",id,time);

sleep(time);

sem_post(&chopsticks[(id + 1)%5]);
printf("Philosopher %d releases chopstick %d to this RIGHT\n",id,(id+1)%5);
sem_post(&chopsticks[id]);
printf("Philosopher %d releases chopstick %d to this LEFT\n",id,(id));
state = THINKING;

time = (float)rand()/RAND_MAX;
sleep(time);

}

主要程序如下

sem_t chopsticks[5];// five chopsticks as a resource
pthread_t philosopher[5]; //five philosoophers

int main(){
srand(time(NULL));
for ( int i=0 ;i <5;i++){
sem_init(&chopsticks[i], 0, 1); // local to the threads with initial value of 1
}

// now create the indiviual threads
for(int i=0;i<5;i++){
if( pthread_create(&philosopher[i],NULL, Philospoher_behaviour ,&i) != 0) { // create thread one
printf("Cant create thread %d\n",i);
return 1;
}
else{
printf("Creadted Philosopher Number : %d\n",i);
}
}

for(int i=0;i<5;i++){
pthread_join(philosopher[i],NULL);
}

}

如何调试这个错误。我也粘贴一次运行的输出

Creadted Philosopher Number : 0
Philosopher 1 starts THINKING for 0.483853
Creadted Philosopher Number : 1
Philosopher 1 starts THINKING for 0.059081
Creadted Philosopher Number : 2
Philosopher 3 starts THINKING for 0.149168
Creadted Philosopher Number : 3
Philosopher 4 starts THINKING for 0.073436
Creadted Philosopher Number : 4
Philosopher 5 starts THINKING for 0.833351
Philosopher 5 is now HUNGRY
Philosopher 1 is now HUNGRY
Philosopher 5 grabs chopstick 5 to this LEFT
Philosopher 1 grabs chopstick 1 to this LEFT
Philosopher 1 grabs chopstick 2 to this RIGHT
Philosopher 1 starts EATING for time 0.147257
Philosopher 3 is now HUNGRY
Philosopher 3 grabs chopstick 3 to this LEFT
Philosopher 3 grabs chopstick 4 to this RIGHT
Philosopher 1 is now HUNGRY
Philosopher 3 starts EATING for time 0.572829
Philosopher 4 is now HUNGRY
Philosopher 1 releases chopstick 2 to this RIGHT
Philosopher 1 releases chopstick 1 to this LEFT
Philosopher 5 grabs chopstick 1 to this RIGHT
Philosopher 5 starts EATING for time 0.857843
Philosopher 3 releases chopstick 4 to this RIGHT
Philosopher 3 releases chopstick 3 to this LEFT
Philosopher 4 grabs chopstick 4 to this LEFT
Philosopher 4 grabs chopstick 0 to this RIGHT
Philosopher 4 starts EATING for time 0.783497
Philosopher 1 starts THINKING for 0.308573
Philosopher 5 releases chopstick 1 to this RIGHT
Philosopher 4 releases chopstick 0 to this RIGHT
Philosopher 4 releases chopstick 4 to this LEFT
Philosopher 1 grabs chopstick 1 to this LEFT
Philosopher 3 starts THINKING for 0.086635
Philosopher 1 grabs chopstick 2 to this RIGHT
Philosopher 1 starts EATING for time 0.015005
The futex facility returned an unexpected error code.Aborted

还有一个问题,如您所见,哲学家 0 和 2 没有互动,为什么会发生这种情况。

在 GDB 中运行它我得到了这些信息

Thread 6 "part22" received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffff57eb700 (LWP 12247)]
0x00007ffff7825428 in __GI_raise (sig=sig@entry=6)
at ../sysdeps/unix/sysv/linux/raise.c:54
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

最佳答案

您正在将 main() 循环变量 i 的地址传递给每个线程:

pthread_create(&philosopher[i],NULL, Philospoher_behaviour ,&i)

当你的线程执行时

int id  = *(int *)param;

i 中的值可能已更改。

关于c - futex 工具返回了意外的错误代码并中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48714083/

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