linux多线程开发实验报告,linux多线程实验报告.doc

《物联网工程领域应用综合实训》实验报告

PAGE17 / NUMPAGES18

ADDIN CNKISM.UserStyle实验八 Linux多线程实验

报告撰写人

专业班级

学号

姓名

完成时间

。。。

。。。。

。。。

实验目的

了解什么是多线程,熟悉LINUX的多线程机制;

掌握利用信号处理Linux多线程的同步问题;

掌握利用信号量处理Linux多线程的互斥问题;

运用Linux多线程的同步机制和互斥机制实现生产者消费者的编程。

实验内容

“生产者-消费者”问题如下:有一个有限缓冲区和两个线程:生产者和消费者。他们分别不停地把产品放入缓冲区、从缓冲区中拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在缓冲区空的时候也必须等待。另外,因为缓冲区是临界资源,所以生产者和消费者之间必须互斥执行。它们之间的关系如图1所示。现在要求使用共享内存来模拟有限缓冲区,并且使用信号量来解决“生产者-消费者”问题中的同步和互斥问题。

1 生产者和消费者问题描述

2. 问题描述:假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。请用Linux线程编程解决。

2 哲学家进餐问题示意图

实验过程与结果

操作过程

错误

解决方法

实验1

步骤一:

编写producer_customer.c的文件

在不同的编译器中for循环的用法不太一样,在这里最好不要使用for(int i=0; ;)

最好在外声明int i在for循环里直接写i=0

步骤二:

编译代码并且运行代码

步骤三:

运行完毕后,显示以下代码:

生产者消费者先后生产数据以及取出数据,此程序中设置了两个消费者两个生产者,交替进行生产数据消费数据。

实验2

步骤一:

编写philosopher.c的文件

步骤二:

编译代码并且运行代码

步骤三:

实验代码

实验一:

#include

#include

#include

#include

#include

#include

#include

#include

#define MAX_BUFFER_SIZE 10

#define SHM_MODE 0600

#define SEM_MODE 0600

#define SEM_FULL 0

#define SEM_EMPTY 1

#define MUTEX 2

/*

#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)

//union semun is defined by including

#else

// according to X/OPEN we have to define it ourselves

union semun{

int val;

struct semid_ds *buf;

unsigned short *array;

};

#endif

union semun su;//sem union,用于初始化信号量

*/

struct my_buffer

{

int head;

int tail;

char str[MAX_BUFFER_SIZE];

int num; //缓冲区里字母数量

int is_empty;

};

const int N_CONSUMER = 2;//消费者数量

const int N_PRODUCER = 2;//生产者数量

const int N_BUFFER = 10;//缓冲区容量

const int N_WORKTIME = 10;//工作次数

int shm_id = -1;

int sem_id = -1;

pid_t child;

pid_t parent;

//得到10以内的一个随机数

int get_random()

{

int digit;

srand((unsigned)(getpid() + time(NULL)));

digit = rand() % 10;

return digit;

}

//得到A~Z的一个随机字母

char getRandChar()

{

char letter;

srand((unsigned)(getpid() + time(NULL)));

letter =

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值