操作系统实验进展
第一题
伪代码完成
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,终于写完代码了