集 美 大 学 诚毅学院信息工程系
实 验 报 告
课程名称 序号名称
计算机操作系统
实验四 线程同步
姓名 专业 成绩
评语: 孙幸杰 计算1191
学号 日期 教师
2011957032
13.11.30 洪联系
200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期
1. 实验目的:
掌握在Linux环境下的线程创建: clone(); 线程同步:信号灯sem_t实现线程同步与互斥; 实现经典同步问题读者-写者问题; 2.实验环境
Win7系统 虚拟机安装的linux系统。 3.实验内容
用信号灯 + PV操作实现读者—写者问题; 用clone()函数4个读者线程和4个写者线程;
每次读者在共享数据区(缓冲区)读操作,或者写者在共享数据区写操作时,要显示当前正在操作的线程;
按读者优先或者写者优先编写程序,但要明确是那个优先; 4.实验程序 (有详细注释) #include
int readCount=0;
char info[20];//共享数据区 int Reader(int r_n) {
char rc[20]; while(1){
sem_wait(&mutex); readCount++; if(readCount==1) {
sem_wait(&r_w_w);
printf(“First reader inter CR!\\n”); }
sem_post(&mutex); printf(“ %dth reader is reading:”,r_n); strcpy(rc,info); printf(“%s\\n”,rc); sem_wait(&mutex); readCount--;
200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期
if(readCount==0)
sem_post(&r_w_w);
printf(“%dth reader exit.\\n”,r_n); sem_post(&mutex); }
} int Writer(int w_n) {
char ws[20];
sprintf(ws,”%dth writer”,w_n); while(1){
sem_wait(&r_w_w); strcpy(info,ws); sem_post(&r_w_w); } }
main(){
int i,arg;
int clone_flag; char *stack;
sem_init(&r_w_w,0,1); sem_init(&mutex,0,1);
clone_flag=CLONE_VM|CLONE_SIGHAND |CLONE_FS|CLONE_FILES; for(i=0;i<4;i++){ arg=i+1;
stack=(char *) malloc(4096);
clone((void *)Reader,&(stack[4096]), clone_flag,(void *)&arg); stack=(char *) malloc(4096);
clone((void *)Writer,&(stack[4096]), clone_flag,(void *)&arg); }
exit(1); }
5. 实验结果及其分析
200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期
6. 实验小结