#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<iostream>
#include<unistd.h>
#include<semaphore.h>
#define N 5
#define LEFT i
#define RIGHT (i+1)%N
using namespace std;
class Semaphore{
private:
sem_t sem;
public:
Semaphore(int value=1){
sem_init(&sem,0,value);
}
void W(){
sem_wait(&sem);
}
void F(){
sem_post(&sem);
}
};
Semaphore mutex[N];
pthread_t thread[N];
pthread_mutex_t mutex1;
int id[N];
int add=0;
enum state {think,hungry,eat};
state pid_state[N];
void *check_state(int a){
int i =a;
if(pid_state[i]==hungry&&pid_state[LEFT]!=eat&&pid_state[RIGHT]!=eat){
pid_state[i]=eat;
mutex[i].F();
}
}
void *Do_take_fork(int param){
int i =param;
pthread_mutex_lock(&mutex1);
pid_state[i]=hungry;
check_state(i);
pt
哲学家就餐问题,linux下实现。
最新推荐文章于 2024-03-27 12:14:40 发布
这是一个使用C++和pthread库在Linux环境下实现哲学家就餐问题的示例。通过Semaphore类管理信号量,避免哲学家饿死或永不停止的情况。每个哲学家的状态在think、hungry和eat之间转换,并通过检查左右邻居的状态来决定是否可以吃饭。
摘要由CSDN通过智能技术生成