进程(线程)的同步与互斥实验报告

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

操作系统实验报告

课程名称操作系统实验名称进程(线程)的同步与互斥成绩

学生姓名作业君专业软件工程班级、学号

同组者姓名无实验日期2020

一、实验题目:进程(线程)的同步与互斥

二、实验目的:

自行编制模拟程序,通过形象化的状态显示,加深理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。1.掌握基本的同步与互斥算法,理解生产者消费者模型。

2.学习使用Windows中基本的同步对象,掌握相关API的使用方法。

3.了解Windows中多线程的并发执行机制,实现进程的同步与互斥

三、实验内容与要求:

1.实验内容

以生产者/消费者模型为依据,在Windows 环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。

2.实验要求

学习并理解生产者/消费者模型及其同步/互斥规则;

学习了解Windows同步对象及其特性;

熟悉实验环境,掌握相关API的使用方法;

设计程序,实现生产者/消费者进程(线程)的同步与互斥;

四、算法描述(含数据结构定义)或流程图

#include

#include

#include

#include

#include

#include

using namespace std;

#define MAX_THREAD_NUM 64 //最大线程数

#define INTE_PER_SEC 1000 //延迟时间的毫秒值

const int SIZE_OF_BUFFER = 10; //缓冲区长度

int ProductID = 0; //产品号

int ConsumeID = 0; //将被消耗的产品号

int in = 0; //产品进缓冲区时的缓冲区下标

int out = 0; //产品出缓冲区时的缓冲区下标

bool running = true; //判断程序能否继续执行的逻辑值

int g_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列

HANDLE g_hMutex; //公有信号量,用于线程间的互斥HANDLE g_hFullSemaphore; //生产者的私有信号量,当缓冲区满时迫使生产者等待

HANDLE g_hEmptySemaphore; //消费者的私有信号量,当缓冲区空时迫使消费者等待

//定义一个结构体用于存储线程的信息

struct ThreadInfo

{

int serial; //线程号

char entity; //线程类别(生产者或消费者)

double delay; //等待时间

double persist; //操作时间

};

//生产者

void Producer(void* p)

{

//定义变量用于存储当前线程的信息

DWORD m_delay;

DWORD m_persist;

int m_serial;

//从参数中获得信息

m_serial = ((ThreadInfo*)(p))->serial;

m_delay = (DWORD)(((ThreadInfo*)(p))->delay * INTE_PER_SEC);

m_persist = (DWORD)(((ThreadInfo*)(p))->persist * INTE_PER_SEC);

while (running)

{

//P操作

cout << "生产者线程 " << m_serial << " 请求生产." << endl;

WaitForSingleObject(g_hEmptySemaphore, INFINITE);

cout << "生产者线程 " << m_serial << " 请求独占缓冲区." << endl;

WaitForSingleObject(g_hMutex, INFINITE);

Sleep(m_delay); //延迟等待

//生产一个产品

cout << "生产者线程 " << m_serial << " 生产 " << ++ProductID << " 号产品成功." << endl;

cout << "生产者线程 " << m_serial << " 请求将产品 " << ProductID << " 投入缓冲区." << endl;

//把新生产的产品放入缓冲区

g_buffer[in] = ProductID;

in = (in +1)%SIZE_OF_BUFFER;

Sleep(m_persist); //操作等待

cout << "生产者线程 " << m_serial << " 将产品 " << ProductID << " 投入缓冲区中成功." << endl;

//输出缓冲区当前的状态

cout << "****************************" << endl

<< "\n当前缓冲区情况如图(■代表已有产品,□代表没有产品): " << endl;

for (int i = 0;i < SIZE_OF_BUFFER;++i)

{

if (g_buffer[i] != 0) cout << "■";

else cout << "□";

}

cout << "\n\n****************************\n" << endl;

//V操作

ReleaseMutex(g_hMutex);

ReleaseSemaphore(g_hFullSemaphore, 1, NULL);

}

}

//消费者

void Consumer(void* p)

{

DWORD m_delay;

DWORD m_persist;

int m_serial;

//从参数中获得信息

m_serial = ((ThreadInfo*)(p))->serial;

m_delay = (DWORD)(((ThreadInfo*)(p))->delay * INTE_PER_SEC);

m_persist = (DWORD)(((ThreadInfo*)(p))->persist * INTE_PER_SEC);

while (running)

相关文档
最新文档