您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页线程的同步

线程的同步

来源:意榕旅游网


实验一:线程的同步

一、实验目的

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;iP(semid,0);//P(empty)

a += 10;

V(semid,1);//V(data)

}

}

void *subp2()//子线程2,读取公共变量并打印

{

int i,j;

for(i=0;iP(semid,1);//P(data)

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语言编写了程序,希望在接下来的上机中我可以有更大的收获。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务