实验四 同步与互斥 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

#define inc(k) if(k

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(\缓冲池第%d号******\\n\inc(in); }

int remove_item(buffer_item *item) {//从缓冲区内移走一个产品 *item = buffer[out];

printf(\缓冲池第%d号******\\n\inc(out); }

void *producer(void *param) {//生产者进程 buffer_item item; int num = 0; while(1) {

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

printf(\第%d次生产******\\n\printf(\等待empty信号******\\n\sem_wait(&empty);

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4