实验四同步与互斥Linux实验报告材料.docx

上传人:b****6 文档编号:14051516 上传时间:2023-06-20 格式:DOCX 页数:15 大小:730.48KB
下载 相关 举报
实验四同步与互斥Linux实验报告材料.docx_第1页
第1页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第2页
第2页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第3页
第3页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第4页
第4页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第5页
第5页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第6页
第6页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第7页
第7页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第8页
第8页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第9页
第9页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第10页
第10页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第11页
第11页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第12页
第12页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第13页
第13页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第14页
第14页 / 共15页
实验四同步与互斥Linux实验报告材料.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验四同步与互斥Linux实验报告材料.docx

《实验四同步与互斥Linux实验报告材料.docx》由会员分享,可在线阅读,更多相关《实验四同步与互斥Linux实验报告材料.docx(15页珍藏版)》请在冰点文库上搜索。

实验四同步与互斥Linux实验报告材料.docx

实验四同步与互斥Linux实验报告材料

实验四同步与互斥

【实验目的和要求】

1、掌握进程(线程)的同步与互斥。

2、掌握生产者消费者问题的实现方法。

3、掌握多线程编程方法。

【实验容】

实现生产者消费者问题

1、有一个仓库,生产者负责生产产品,并放入仓库,消费者会从仓库中拿走产品(消费)。

2、仓库中每次只能入一个(生产者或消费者)。

3、仓库中可存放产品的数量最多10个,当仓库放满时,生产者不能再放入产品。

4、当仓库空时,消费者不能从中取出产品。

5、生产、消费速度不同。

【实验原理】

1、信号量mutex提供对缓冲池访问的互斥要求并初始化为1,信号量empty和full分别用来表示空缓冲项和满缓冲项的个数,信号量empty初始化为n,信号量full初始化为0。

 

2、定义如下结构及数据:

  

定义缓冲区的数据类型:

typedef int buffer_item; 

缓冲区 :

buffer_item buffer[BUFFER_SIZE];

对缓冲区操作的变量:

int in,out; 

信号量mutex提供了对缓冲池访问的互斥要求:

pthread_mutex_t mutex; 

信号量empty和full分别表示空缓冲顶和满缓冲顶的个数:

sem_t empty,full; 

可以设定生产者的生产速度及消费者的消费速度 :

int pro_speed,con_speed;

对缓冲区操作的自增函数:

#define inc(k) if(k < BUFFER_SIZE) k = k+1;else k=0

3、并定义了如下实现问题的函数模块:

 

将生产的产品放入缓冲区:

 int insert_item(buffer_item item)      

从缓冲区移走一个产品:

 int remove_item(buffer_item *item)    

生产者进程 :

void *producer(void *param)        

 消费者进程:

void *consumer(void *param)     

生产者结构进程消费者结构进程

 

【程序代码】

//sx.c

#include

#include

#include

#include

#include

#defineinc(k)if(k

#defineBUFFER_SIZE10//缓冲区的大小

typedefintbuffer_item;//定义缓冲区的数据类型

buffer_itembuffer[BUFFER_SIZE];//缓冲区

intin,out;//对缓冲区操作的变量

pthread_mutex_tmutex;//信号量mutex提供了对缓冲池访问的互斥要求

sem_tempty,full;//信号量empty和full分别表示空缓冲顶和满缓冲顶的个数

intpro_speed,con_speed;//可以设定生产者的生产速度及消费者的消费速度

intinsert_item(buffer_itemitem)

{//将生产的产品放入缓冲区

buffer[in]=item;

printf("******insert缓冲池第%d号******\n",in);

inc(in);

}

intremove_item(buffer_item*item)

{//从缓冲区移走一个产品

*item=buffer[out];

printf("******remove缓冲池第%d号******\n",out);

inc(out);

}

void*producer(void*param)

{//生产者进程

buffer_itemitem;

intnum=0;

while

(1)

{

sleep(rand()%(16-pro_speed));

printf("\n******第%d次生产******\n",++num);

printf("******等待empty信号******\n");

sem_wait(&empty);

printf("******等待解锁******\n");

pthread_mutex_lock(&mutex);

printf("******上锁,准备生产******\n");

item=rand()%1000+1;

printf("******生产产品%d*******\n",item);

insert_item(item);

printf("*******解锁******\n");

printf("******第%d次生产结束*******\n\n",num);

pthread_mutex_unlock(&mutex);

sem_post(&full);

}

}

void*consumer(void*param)

{//消费者进程

buffer_itemitem;

intnum=0;

while

(1){

sleep(rand()%(16-con_speed));

printf("\n******第%d次消费*****\n",++num);

printf("******等待full信号******\n");

sem_wait(&full);

printf("******等待解锁******\n");

pthread_mutex_lock(&mutex);

printf("******上锁,准备消费******\n");

remove_item(&item);

pthread_mutex_unlock(&mutex);

sem_post(&empty);

printf("******消费产品%d*******\n",item);

printf("*******解锁******\n");

printf("******第%d次消费结束*******\n\n",num);

}

}

intmain()//主函数

{

pthread_ttid1,tid2;

pthread_attr_tattr1,attr2;

srand(time(NULL));

pthread_mutex_init(&mutex,NULL);//初始化

sem_init(&empty,0,BUFFER_SIZE);

sem_init(&full,0,0);

in=0;

out=0;

printf("***********************\n");

printf("********开始!

***********\n");

printf("***********************\n");

printf("生产者速度(1-15):

\n");

scanf("%d",&pro_speed);

printf("消费者速度(1-15):

\n");

scanf("%d",&con_speed);

pthread_attr_init(&attr1);

pthread_create(&tid1,&attr1,producer,NULL);

pthread_attr_init(&attr2);

pthread_create(&tid2,&attr2,consumer,NULL);

sleep(100);

printf("*******程序over*******\n");

return0;

}

【实验步骤】

编写程序代码geditsx.c,再对代码进行编译gccsx.c–osx–lpthread,编译无错误,进行运行./sx,根据提示要求进行填写生产者和消费速度,观察消费者和生产者进程。

 

【实验结果】

【实验体会】

1、Linux中生成线程方法:

第一种方式是用pthread库来实现的,是在用户程序本身中实现线程,这实际上是对线程的一种模拟,线程之间的切换和调度是在用户的进程部进行的,这种方式就被称为用户空间的线程。

这种线程的好处是实现非常简单,性能也非常好,因为线程之间的切换都在用户进程部进行,切换开销比较小。

缺点也非常明显,首先就是不能充分利用高端系统的SMP多处理器的优点,因为一个进程只能由一个处理器处理,第二点由于用户空间是在用户空间切换,某个线程遇到一个需要阻塞的系统调用进而就会造成这个进程被阻塞,因而所有线程被阻塞。

第二种方式是通过修改进程的实现方式来完成,可以使用不完全的进程创建方式创建共享数据空间的进程,在Linux下这种系统调用为clone()。

2、Ptrtead生成线程:

POSIXthread简称为pthread,Posix线程是POSIX标准线程该标准定义部API创建和操纵线程。

 

数据类型pthread_t:

线程句柄pthread_attr_t:

线程属性线程操纵函数(省略参数):

pthread_create():

创建一个线程

pthread_exit():

终止当前线程

pthread_cancel():

中断另外一个线程的运行

pthread_join():

阻塞当前的线程,直到另外一个线程运行结束

pthread_attr_init():

初始化线程的属性

pthread_attr_setdetachstate():

设置脱离状态的属性(决定这个线程在终止时是否可以被结合)

pthread_attr_getdetachstate():

获取脱离状态的属性

pthread_attr_destroy():

删除线程的属性

pthread_kill():

向线程发送一个信号

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2