int set_sem(key_t sem_key,int sem_val,int sem_flag);
char *set_shm(key_t shm_key,int shm_num,int shm_flag);
int no;
queue inQue;
queue waitQue;
private:
int rate ;
Lock *lock;
char *state[2];
Condition *self[2];
};
Dp.cpp
#include "dp.h"
using namespace std;
Sema::Sema(int id)
{
sem_id = id;
}
Sema::~Sema(){ }
int Sema::down()
{
}
int Sema::up()
{
struct sembuf buf;
buf.sem_op = -1;
buf.sem_num = 0;
buf.sem_flg = SEM_UNDO;
if((semop(sem_id,&buf,1)) <0) {
perror("down error ");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
Sem_uns arg;
struct sembuf buf;
buf.sem_op = 1;
buf.sem_num = 0;
buf.sem_flg = SEM_UNDO;
if((semop(sem_id,&buf,1)) <0) {
perror("up error ");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
Lock::Lock(Sema * s)
{
sema = s;
}
Lock::~Lock(){ }
void Lock::close_lock()
{
}
void Lock::open_lock()
sema->down();
sema->up();
{
}
Condition::Condition(char *st[] ,Sema *sm){
state = st;
sema = sm;
}
void Condition::Wait(Lock *lock,int i)
{
if((*state[(i+1)%2]!=running)&&(*state[i]==waiting))*state[i]=running;
else
{//
//cout<<"p"<open_lock();
sema->down();
lock->close_lock();
}
void Condition::Signal(int i)
{
if((*state[(i+1)%2]!=running)&&(*state[i]==waiting))
{
sema->up();
*state[i]=running;
}
}
}
int dp::get_ipc_id(char *proc_file,key_t key)
{
#define BUFSZ 256
FILE *pf;
int i,j;
char line[BUFSZ],colum[BUFSZ];
if((pf = fopen(proc_file,"r")) == NULL){
perror("Proc file not open");
exit(EXIT_FAILURE);
}
fgets(line, BUFSZ,pf);
while(!feof(pf)){
i = j = 0;
fgets(line, BUFSZ,pf);
while(line[i] == ' ') i++;
while(line[i] !=' ') colum[j++] = line[i++];
colum[j] = '\0';
if(atoi(colum) != key) continue;
j=0;
while(line[i] == ' ') i++;
while(line[i] !=' ') colum[j++] = line[i++];
colum[j] = '\0';
i = atoi(colum);
fclose(pf);
return i;
}
fclose(pf);
return -1;
}
int dp::set_sem(key_t sem_key,int sem_val,int sem_flg)
{
int sem_id;
Sem_uns sem_arg;
if((sem_id=get_ipc_id("/proc/sysvipc/sem",sem_key)) < 0 ){
if((sem_id = semget(sem_key,1,sem_flg)) < 0){
perror("semaphore create error");
exit(EXIT_FAILURE);
}
}
sem_arg.val = sem_val;
if(semctl(sem_id,0,SETVAL,sem_arg) < 0){
perror("semaphore set error");
exit(EXIT_FAILURE);
}
return sem_id;
}
char * dp::set_shm(key_t shm_key,int shm_num,int shm_flg)
{
int i,shm_id;
char * shm_buf;
if((shm_id=get_ipc_id("/proc/sysvipc/shm",shm_key))<0){
if((shm_id= shmget(shm_key,shm_num,shm_flg)) <0){
perror("shareMemory set error");
exit(EXIT_FAILURE);
}
if((shm_buf=(char *)shmat(shm_id,0,0)) < (char *)0){
perror("get shareMemory error");
exit(EXIT_FAILURE);
for(i=0; i
}
}
//放下筷子的操作
//状态改变为思考,如左右邻居有阻塞者则唤醒它
void dp::putdown(int i){
int j;
lock->close_lock();//进入管程,上锁
*state[i]=waiting; //进思考态
j = (i+1)%2;
self[j]->Signal(j);//唤醒左邻居
//j = (i+1)%5;
//self[j]->Signal(j);//唤醒右邻居
lock->open_lock();//离开管程,开锁
//cout << "p" <close_lock();//进入管程,上锁
*state[i]=waiting; //进饥饿态
int NO=inQue.front();inQue.pop();
waitQue.push(NO);
cout << "p" <Wait(lock,i); //测试是否能拿到两只筷子
int ON=waitQue.front();waitQue.pop();
cout << "p" << i+1<<" NO:"<open_lock();//离开管程,开锁
<< " waiting\n";
}
dp::~dp(){}
/*
int main(int argc,char **argv)
{
dp *tdp;//管程对象指针
int pid[2];
int rate;//
rate=(argc>1)?atoi(argv[1]):3;
tdp = new dp(rate); //建立一个哲学家就餐的管程对象
pid[0]=fork(); //建立第一个哲学家进程
if(pid[0]<0){
perror("p1 create error");
exit(EXIT_FAILURE);
}
else if(pid[0]==0){
//利用管程模拟第一个哲学家就餐的过程
while(1){
tdp->pickup(0);//拿起筷子
tdp->putdown(0);//放下筷子
}
}
pid[1]=fork();
if(pid[1]<0){
//建立第二个哲学家进程
perror("p2 create error");
exit(EXIT_FAILURE);
}
else if(pid[1]==0){
//利用管程模拟第二个哲学家就餐的过程
while(1){
tdp->pickup(1);//拿起筷子
tdp->putdown(1);//放下筷子
}
}
}*/
Main.cpp
#include
#include"dp.h"
pthread_t p1,p2;
void *createThread1(void *arg);
void *createThread2(void *arg);
/*
void* createThread(void
* arg)
{
dp *tdp=(dp *)arg;
tdp->pickup(0);
tdp->putdown(0);
}*/
int main(int argc,char **argv)
{
dp *tdp1,*tdp2;//管程对象指针
int pid[2];
int rate;//
rate=(argc>1)?atoi(argv[1]):3;
tdp1 = new dp(rate); //建立一个哲学家就餐的管程对象
tdp2 = new dp(rate);
srand((unsigned int)time(NULL));
pid[0]=fork(); //建立第一个哲学家进程
if(pid[0]<0){
perror("p1 create error");
exit(EXIT_FAILURE);
}
else if(pid[0]==0){
//利用管程模拟第一个哲学家就餐的过程
while(1){
pthread_create(&p1,NULL,createThread1,(void *)tdp1);
//tdp->pickup(0);//拿起筷子
//tdp->putdown(0);//放下筷子
//printf("%d\n",getpid());
sleep(rand()%10);
}
}
else
{
while(1){
pthread_create(&p2,NULL,createThread2,(void *)tdp2);
//tdp->pickup(0);//拿起筷子
//printf("%d\n",getpid());
sleep(rand()%10);
//tdp->putdown(0);//放下筷子
}
}
/*pid[1]=fork();
if(pid[1]<0){
//建立第二个哲学家进程
perror("p2 create error");
exit(EXIT_FAILURE);
}
else if(pid[1]==0){
//利用管程模拟第二个哲学家就餐的过程
while(1){
tdp->pickup(1);//拿起筷子
tdp->putdown(1);//放下筷子
}
}*/
}
void* createThread1(void
{
* arg)
dp *tdp=(dp *)arg;
int no=(rand()+1)%100000000;
tdp->inQue.push(no);
tdp->pickup(0);
tdp->putdown(0);
}
void* createThread2(void
{
* arg)
dp *tdp=(dp *)arg;
int no=rand()%100000000;
tdp->inQue.push(no);
tdp->pickup(1);
tdp->putdown(1);
}
Author sdu software college 200904 xxc
如有任何问题请发邮箱 411767596@qq.com