- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用资源层次结构解决方案在 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/
我正在尝试使用 Java 中的 Future 来解决哲学家问题。 public class Philo implements Callable { private PhiloStatus s
这是我对哲学家晚餐并发问题的实现。我只为两个线程工作,其余线程遭受饥饿,从字面上看 ;) 如果您能找到原因,我将不胜感激。 这是输出: Philosopher 2 is eating Philosop
来自操作系统概念 5.8.2 Dining-Philosophers Solution Using Monitors Next, we illustrate monitor concepts by p
为了熟悉 Haskell 中的 STM,我编写了以下哲学家就餐问题的解决方案: import Control.Concurrent import Control.Concurrent.STM impo
我正在尝试使用资源层次结构解决方案在 C 语言中实现 Dining Philosophers。当我使用 valgrind 时,一切正常。不幸的是,当我使用控制台完成此操作时,我得到了随机的 seqfa
我不是 C# 的初学者,但我确实需要增加我的理解,所以我选择了一个经典的死锁问题来编写代码,以帮助自学一些更高级的 C# 概念。 Dining Philosophers Problem看起来不错,但我
我正在尝试解决哲学家用餐问题。所以我几乎编写了整个代码,但问题是我无法初始化监视器(我制作了我用 C++ 重写的伪代码)所以我真的不能测试程序。谁能帮我说说 monitor/mutex_init 的初
我正在尝试用C语言实现哲学家就餐问题,使用的是p线程、互斥锁和条件变量。。我对输出有几个问题:。下面是我的代码:。以下是使用10秒的输出:。如果有任何帮助,我将不胜感激。谢谢!
我是一名优秀的程序员,十分优秀!