操作系统实验记录

操作系统实验进展

第一题
伪代码完成

int main()//主函数示例
{

    int s1=0;//满缓冲区数目
    int s2=3;//空缓冲区数目
    int s=1;//进入病房的人
    int mutex=1;//对有界缓冲区进行操作的互斥信号灯
    cobegin
        p1(); p2();......p10();
        doctor();
        nurse();
    coend
}

patienti()
{
    while(n<10)
    {
        p(s2);//询问是否有空椅子
            p(mutex);
                坐椅子上 放到椅子队列;
            v(mutex);
        v(s1);
        p(s);
     }
    return;
}

nurse()
{
    while(n<10);
    {
        p(sb);//询问医生是否有病人
        p(s1);//询问是否有病人等待
        p(mutex);
            叫病人,把他放到进诊室队列;
        v(mutex);
        v(s2);
        v(sa);//唤醒医生
}

doctor()
{
    while(n<10);
    {
        p(sa);//询问是否有病人来
        v(s);//唤醒病人
        p(mutex);
        sleep 3~5s
        n++;
        v(mutex);
        v(sb);//告诉护士没人了
    }
    return
}

找到几篇可以参考的文章
https://blog.csdn.net/weixin_42031299/article/details/91360894
这篇含有对队列的操作,打算在P,V操作间实现对队列的操作而非仅仅输出文字“我进病房啦”之类的
https://blog.csdn.net/xlgen157387/article/details/41621887
这两篇大概是使用线程的范例
https://blog.csdn.net/coin06/article/details/80304282
理发师问题

稍微改了一下第一篇的main函数
写了doctor函数

#include <pthread.h>  
#include <stdio.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <semaphore.h>  
#include <sys/time.h>  
#include <math.h>  

sem_t sa; 
sem_t sb; 
sem_t s1; //满缓冲区数目
sem_t s2; //空缓冲区数目
sem_t s; 
pthread_mutex_t mutex; 
void *doctor (void *arg)					    /*医生线程程序*/
{
	while(n<10)								/*治疗了十个人之后退出*/
	{	
	    sem_wait(&sb);//询问是否有病人来
        sem_post(&s);//唤醒病人
		pthread_mutex_lock(&mutex);			/*进入互斥区*/
		printf("治疗开始"); 	/*打印信息*/
		sleep(3);
		n++;
		printf("治疗完毕"); 	/*打印信息*/
		pthread_mutex_unlock(&mutex);			/*离开互斥区*/
        sem_post(&sa);//告诉护士没人了
	}
}

void *nurse (void *arg)					    /*护士线程程序*/
{
	while(n<10)								/*治疗了十个人之后退出*/
	{	
	    sem_wait(&sb);//询问医生是否有病人就诊
        sem_wait(&s1);//询问是否有病人等待
		pthread_mutex_lock(&mutex);			/*进入互斥区*/
		printf("下一位"); 	/*打印信息*/
		pthread_mutex_unlock(&mutex);			/*离开互斥区*/
		sem_post(&s2);
        sem_post(&sa);//唤醒医生
	}
}
  
void *paitient (void *arg)					    /*病人线程程序*/
{
	while(n<10)								/*治疗了十个人之后退出*/
	{	
	    sem_wait(&s2);//询问是否有空椅子
		pthread_mutex_lock(&mutex);			/*进入互斥区*/
		printf("我坐了"); 	/*打印信息*/
		pthread_mutex_unlock(&mutex);			/*离开互斥区*/
		sem_post(&s1);
        sem_wait(&s);//唤醒医生
	}
}  
int main(){
    sem_init(&sa,0,0);
    sem_init(&sb,0,1);
    sem_init(&s1,0,0);
    sem_init(&s2,0,3);
    sem_init(&s,0,0);
    
    void *thread_result;
	list = create_list();
	pthread_t doc,nur,c[9];
	pthread_mutex_init (&mutex,NULL);			/*初始化互斥*/
    sem_init(&full, 0, 0);
	sem_init(&empty, 0, MAX);

	//创建10个病人
	for(int i = 0; i < 10; i++){
		int *p = (int *)malloc(sizeof(int));
		*p = i;
		pthread_create(&tid, NULL, patient, p);
	}

	//创建1个医生
	pthread_create(&doc, NULL, doctor, NULL);

    //创建1个护士
	pthread_create(&nur, NULL, nurse, NULL);

    for(i = 0; i < 10; ++i)                      /*等待病人线程退出*/
		pthread_join(c[i],&thread_result);
		
    pthread_join(doc,&thread_result);           /*等待医生线程退出*/
    pthread_join(nur,&thread_result);           /*等待护士线程退出*/
    pthread_mutex_destroy(&mutex);				/*销毁互斥*/
    return 0;
}

信号量申请那里还没写好
创建进程那里的指针是啥也没明白
先酱紫

#include <pthread.h>  
#include <stdio.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <semaphore.h>  
#include <sys/time.h>  
#include <math.h>  

sem_t sa; 
sem_t sb; 
sem_t s1; //满缓冲区数目
sem_t s2; //空缓冲区数目
sem_t s; 
pthread_mutex_t mutex; 
int patn=0;
void *doctor (void *arg)					    /*医生线程程序*/
{
    int n=0;
	while(n<10)
        {
	    sem_wait(&sa);//询问是否有病人来
            sem_wait(&s);
	    pthread_mutex_lock(&mutex);			/*进入互斥区*/
	    printf("doctor : So let's begin\n"); 	/*打印信息*/
            int slp=rand();
            slp=slp%5;
	    sleep(slp);
	    n++;
	    printf("That's all , have a nice day!\n"); 	/*打印信息*/
	    pthread_mutex_unlock(&mutex);			/*离开互斥区*/
            sem_post(&sb);//告诉护士没人了
	}
        return NULL;
}

void *nurse (void *arg)					    /*护士线程程序*/
{
    int n=0;
	while(n<10)
        {
	    sem_wait(&sb);//询问医生是否有病人就诊
            sem_wait(&s1);//询问是否有病人等待
	    pthread_mutex_lock(&mutex);			/*进入互斥区*/
            printf("nurse:");
	    printf("please the next one come in!\n"); 	/*打印信息*/
            n++;
	    pthread_mutex_unlock(&mutex);			/*离开互斥区*/
	    sem_post(&s2);
            sem_post(&sa);//唤醒医生
         }
         return NULL;
}
  
void *paitient (void *arg)					    /*病人线程程序*/
{	
    
	    sem_wait(&s2);//询问是否有空椅子
	    pthread_mutex_lock(&mutex);			/*进入互斥区*/
	    printf("patient:So I'll sit here and wait.\n"); 	/*打印信息*/
            patn++;
            printf("the no.%d patient is waiting...\n",patn);
	    pthread_mutex_unlock(&mutex);			/*离开互斥区*/
	    sem_post(&s1);//hushi
            sem_post(&s);//唤醒医生
        return NULL;
}  

int main()
{
    sem_init(&sa,0,0);
    sem_init(&sb,0,1);
    sem_init(&s1,0,0);
    sem_init(&s2,0,3);
    sem_init(&s,0,0);
    int res;
    void *thread_result;
    pthread_t doc,nur,c;
    int num[10]={0,1,2,3,4,5,6,7,8,9};
    pthread_mutex_init (&mutex,NULL);			/*初始化互斥*/

    
 
    //创建1个护士
	pthread_create(&nur, NULL, nurse, NULL);

    //创建1个医生
    pthread_create(&doc, NULL, doctor, NULL);

//创建10个病人
    for(int i = 0; i < 10; i++){
		pthread_create(&c, NULL, paitient, &num[i]);
	}
    //for(int i = 0; i < 10; ++i)                      /*等待病人线程退出*/
	pthread_join(c,NULL);
		
    pthread_join(doc,NULL);           /*等待医生线程退出*/
    pthread_join(nur,NULL);           /*等待护士线程退出*/
    pthread_mutex_destroy(&mutex);				/*销毁互斥*/
    
    sem_destroy(&sa);
    sem_destroy(&sb);
    sem_destroy(&s1);
    sem_destroy(&s2);
    sem_destroy(&s);
    return 0;
}

凌晨1:27,终于写完代码了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值