用多线程同步方法解决生产者-消费者问题(操作系统课设)

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

.

题目用多线程同步方法解决生产者-消费

者问题(Producer-Consumer Problem)

学院计算机科学与技术学院

专业软件工程

班级

姓名

指导教师

年月日

目录

目录 (1)

课程设计任务书 (2)

正文 (2)

1.设计目的与要求 (2)

1.1设计目的 (2)

1.2设计要求 (2)

2.设计思想及系统平台 (2)

2.1设计思想 (2)

2.2系统平台及使用语言 (2)

3.详细算法描述 (3)

4.源程序清单 (7)

5.运行结果与运行情况 (13)

6.调试过程 (17)

7.总结 (17)

本科生课程设计成绩评定表 (18)

课程设计任务书

学生姓名:专业班级:

指导教师:工作单位:计算机科学与技术学院

题目: 用多线程同步方法解决生产者-消费者问题(Producer-Consumer Problem)

初始条件:

1.操作系统:Linux

2.程序设计语言:C语言

3.有界缓冲区内设有20个存储单元,其初值为0。放入/取出的数据项按增序设定为1-20这20个整型数。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要

求)

1.技术要求:

1)为每个生产者/消费者产生一个线程,设计正确的同步算法

2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部内容、当前指针位置和生产者/消费者线程的自定义标识符。

3)生产者和消费者各有两个以上。

4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。

2.设计说明书内容要求:

1)设计题目与要求

2)总的设计思想及系统平台、语言、工具等。

3)数据结构与模块说明(功能与流程图)

4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个程序及其运行结果的主机IP地址和目录。)

5)运行结果与运行情况

(提示: (1)有界缓冲区可用数组实现。

(2)编译命令可用:cc -lpthread -o 目标文件名源文件名

(3)多线程编程方法参见附件。)

3. 调试报告:

1)调试记录

2)自我评析和总结

上机时间安排:

18周一~ 五08:0 -12:00

指导教师签名:年月日系主任(或责任教师)签名:年月日

正文

1.设计目的与要求

1.1设计目的

通过研究Linux的线程机制和信号量实现生产者消费者问题(Producer-Consumer Problem)的并发控制。

1.2设计要求

1)为每个生产者/消费者产生一个线程,设计正确的同步算法

2)每个生产者/消费者对该存储区进行操作后,即时显示该存储区的全部内容、当前指针位置和生产者/消费者线程的自定义标识符。

3)生产者和消费者各有两个以上。

4)多个生产者/消费者之间须共享对存储区进行操作的函数代码。

2.设计思想及系统平台

2.1设计思想

在本问题中,共需要一个Mutex和两个Semaphore.

其中,Mutex是用来锁定临界区的,以解决对共享数据buffer的互斥访问问题(无论是对

生成者还是对消费者);

我们共需要两个Semaphore,这是因为在本问题中共有两个稀缺资源.

第一种是"非空"这种资源,是在消费者之间进行竞争的.

第二种是"非满"这种资源,是在生产者之间进行竞争的.

所以,一般来说,需要锁定临界区,就需要Mutex;有几种稀缺资源就需要几个Semaphore.

对稀缺资源的分析不能想当然.稀缺资源不一定是指被共享的资源,很多时候是指线程会被阻塞的条件(除了要进临界区被阻塞外).

在生产者消费者问题中,消费者会在缓冲区为空时被阻塞,所以"非空"是一种稀缺资源; 需要设置一个信号量consumer_semaphore,初值设为0;

生产者会在缓冲区为满时被阻塞,所以"非满"也是一种稀缺资源.

需要设置一个信号量producer_semaphore,初值设为buffer的大小MAX_BUFFER 2.2系统平台及使用语言

本课程设计在Linux操作系统下,使用C语言完成。用到的工具主要有GCC编译器和VI编辑器。

3.详细算法描述

共享数据:

Semaphore buffer_mutex=1;

Semaphore producer_semaphore=MAX_BUFFER;

Semaphore consumer_semaphore=0;

int buffer[MAX_BUFFER];

Producer线程的处理函数:

while(1){

Wait(producer_semaphore);

Wait(buffer_mutex);

Buffer[pn]=product;

pn=(pn+1)%MAX_BUFFER;

Signal(consumer_semaphore);

Signal(buffer_mutex);

Sleep();

}

producer线程的处理函数流程图如下:

consumer线程的处理函数: while(1){

Wait(consumer_semaphore); Wait(buffer_mutex); Consume=buffer[cn];

cn=(cn+1)%MAX_BUFFER; Signal(producer_semaphore); Signal(buffer_mutex);

相关文档
最新文档