我试图用信号量来解决哲学家吃饭的问题。哲学家先拿起左叉子,然后拿起右叉子,吃完后把它们放下。我使用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
中的值可能已更改。
对于这些样式,如果我增加宽度,元素将从左侧增长。这意味着getBoundingClientRect()。在我调整宽度后,该元素的右边应该有相同的值。 但是当我使用javascript来增加宽度时,情况就不一样了。为什么不呢? 当鼠标在元素上移动时,我会增加宽度,如下所示: 每次的输出都是不同的。
在我的MySQL数据库中,我有一个表"table1",在列"name"上设置了唯一约束-我想防止重复的名称。 如果表中已经有名字'John',则此代码: 应该抛出insertUnonnequeException()(我自己的异常)。相反,它抛出InsertException()。 查询的执行返回false,执行进入if()循环。另外$db- 我不知道为什么当发生唯一密钥约束冲突时,mysqli不返
嘿,我遇到了一个关于与jackson反序列化的问题,这里是我尝试过的和我得到的错误。 错误:com。fasterxml。杰克逊。果心JsonParseException:意外字符('}'(代码125)):应以双引号开始字段名 Java代码 我的JSON
我有一个请求和响应Json。当我提交请求时,它将在我的应用程序中显示响应。Url显示邮递员请求和响应[1]:https://i.stack.imgur.com/UW4jo.png我尝试了下面的代码,但面临的问题是,我得到了正确的JSONObject响应,但在调试时,当光标进入改装的onResponse方法时,主体显示为null,错误代码为500。但在《邮差》中,一切都很好。我因为这个问题浪费了两天
我有一个返回: 然后另一个用户这样使用它: 如何处理任何迭代中的失败情况? 我知道我可以使用,在这种情况下,错误结果将被忽略: 的迭代器根据成功状态具有0或1项,如果为0,将过滤掉它。 但是,我不想忽略错误,而是想让整个代码块停止并返回一个新错误(基于映射中出现的错误,或者只是转发现有错误)。 在Rust中如何最好地处理此问题?
问题内容: 我在下面编写了此方法,该方法假定是从数据库中删除成员记录。但是,当我在servlet中使用它时,它将返回错误。 会员班 控制器部分 HTTP状态500 有时,当我尝试多次执行页面时,甚至会引发此错误。 有人知道究竟是什么引起这些错误吗? 问题答案: 该错误可能是由多种原因引起的。我不为此而功劳,在这里找到了它。 在提交对象之前刷新数据可能会导致清除所有等待持久化的对象。 如果对象具有自