实验四-同步与互斥-Linux实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四同步与互斥

【实验目的和要求】

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

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

#define inc(k) if(k

#define BUFFER_SIZE 10//缓冲区的大小

typedef int buffer_item;//定义缓冲区内的数据类型

buffer_item buffer[BUFFER_SIZE];//缓冲区

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

pthread_mutex_t mutex;//信号量mutex提供了对缓冲池访问的互斥要求sem_t empty,full;//信号量empty和full分别表示空缓冲顶和满缓冲顶的个数int pro_speed,con_speed;//可以设定生产者的生产速度及消费者的消费速度int insert_item(buffer_item item)

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

buffer[in]=item;

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

inc(in);

}

int remove_item(buffer_item *item)

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

*item = buffer[out];

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

inc(out);

}

void *producer(void *param)

{//生产者进程

buffer_item item;

int num = 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_item item;

int num = 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); }

}

相关文档
最新文档