实验一:线程的同步
一、实验目的
1、掌握Linux系统用户界面中键盘命令的使用。
2、学会一种Linux下的编程环境。
3、掌握Linux下进(线)程的概念。
4、了解Linux进程同步与通信的主要机制,并通过信号灯操作实现进程间的同步与互斥。
二、实验内容
1、程序要求
两个线程,共享公共变量a:
线程1负责计算(+10);
线程2负责打印。
2、运行环境
软件配置(含操作系统版本):Ubuntu 14.04
硬件:Intel® Core™ i5-3230M CPU @ 2.60GHz 安装内存4GB
3、源程序
#include #include #include #include int a=0; int LOOPS = 10; int semid; union semun { int val; /* Value for SETVAL */ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO*/ } semopts; void P(int semid, int index)//P操作 { struct sembuf sem; //此数据类型在sys/sem.h中定义 sem.sem_num = index; //对信号量集中的第index个元素进行P操作 sem.sem_op = -1; //表示P操作 sem.sem_flg = 0; //操作标记:0或IPC_NOWAIT等 semop(semid,&sem,1); //1:要操作1个信号量 } void V(int semid,int index)//V操作 { struct sembuf sem; //此数据类型在sys/sem.h中定义 sem.sem_num = index; //对信号量集中的第index个元素进行V操作 sem.sem_op = 1; //表示V操作 sem.sem_flg = SEM_UNDO; //操作标记 semop(semid,&sem,1); //1:要操作1个信号量 } void *subp1()//子线程1,对公共变量进行计算 { int i; for(i=0;i a += 10; V(semid,1);//V(data) } } void *subp2()//子线程2,读取公共变量并打印 { int i,j; for(i=0;i printf(\"subp1:a=%d\\n\ V(semid,0);//V(empty) } } int main(void) { int res; pthread_t p1; pthread_t p2; semid = semget(300,2,0666|IPC_CREAT); //资源empty初始化为1 semopts.val = 1; res=semctl(semid,0,SETVAL,semopts); //资源data初始化为0 semopts.val = 0; res=semctl(semid,1,SETVAL,semopts); pthread_create(&p1,NULL,subp1,NULL); pthread_create(&p2,NULL,subp2,NULL);//创建两个子线程 pthread_join(p1,NULL);//主线程等待p1结束 pthread_join(p2,NULL);// 主线程等待p2结束 return 0; } 4、实验结果 实验结果如图。 图2-1 程序运行结果1 图2-2 程序运行结果2 三、实验心得 在本次操作系统实验中,我初次接触到了LINUX系统。 之前我接触到的都是WINDOWS系统,在LINUX系统上操作的时候,我发现这两种系统有很大的不同。LINUX系统中许多操作都可以在终端中进行,十分方便,也就是说用户可以对LINUX系统进行更多的操作。在这次实验中,我使用vi编辑器来编辑文件。Vi有三种模式,在使用时不时要进行切换。还有在LINUX中编译C语言时,要通过终端使用GCC编译器来编译。在LINUX系统下的C语言和Windows中的有很大不同。 本次实验的目的是线程的同步,要创建两个线程,这两个线程使用同一个公共变量,一个对其进行计算操作,一个对其进行打印操作,通过PV操作实现线程间的同步和互斥。对信号量的操作是这个实验的难点之一,在上课学习的时候我就觉得这一部分很难,幸好这一次有老师的讲解,让我能够顺利地完成实验,这让我觉得上课认真听讲十分重要。 经过这次实验,我对LINUX系统有了初步的了解,也第一次在LINUX系统下用C语言编写了程序,希望在接下来的上机中我可以有更大的收获。 因篇幅问题不能全部显示,请点此查看更多更全内容