实验二 生产者与消费者
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
伪代码
Producer() { /*程序所需其他代码*/ while(TRUE){ /*程序所需其他代码*/ /*生产一个物品;*/ If (WaitForSingleObject(m_S_Empty, WaitTime) == WAIT_OBJECT_0) { if (WaitForSingleObject(m_M_Mutex, WaitTime) == WAIT_OBJECT_0) { /*将所生产的物品放到指定的缓冲区中;*/ ReleaseMutex(m_M_Mutex); ReleaseSemaphore(m_S_Full, 1, NULL); } } }
Consumer() { /*程序所需其他代码*/ while(TRUE){ /*程序所需其他代码*/ If (WaitForSingleObject(m_S_Full, WaitTime) == WAIT_OBJECT_0) { if (WaitForSingleObject(m_M_Mutex, WaitTime) == WAIT_OBJECT_0) { /*取出一个物品*/ ReleaseMutex(m_M_Mutex); ReleaseSemaphore(m_S_ Empty, 1, NULL); } } }
返回值:无。
CreateMutex ()
函数功能: 该函数创建有名或无名 的互斥对象。 函数原型: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName );
– 如果成功,则传回TRUE。否则传回FALSE。
实验内容与步骤
进程的互斥与同步。编写一段程序,模拟生
产者和消费者线程,实现进程的互斥与同步。
利用VC++6.0实现上述程序设计和调试操作,
对于生产者和消费者线程操作的成功与否提
供一定的提示框。
通过阅读和分析实验程序,熟悉进程的互斥 与同步的概念。
线程创建
CreateThread 函数功能:该函数创建一个在调用进程的地址空间中执行 的线程。 函数原型: HANDL CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadld);
返回值:
– 如果函数调用成功,返回值表明引起函数返回的事件。 –如果函数调用失败,返回值是WAIT_FAILED。
CreateSemapore()
函数功能: 该函数是创建一个有名或者无名信 号对象。 函数原型: HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName); 返回值:
专业资料实验报告?每人独立一组需要上交实验报告?实验报告包括实验目的实验内容主要程序结构附注释实验步骤实验中遇到的问题及解决方法等
操作系统原理实验
浙江工业大学计算机科 学与技术学院 何玲娜
实验二 进程的互斥与同步 (生产者与消费者问题)
实验目的:
利用Windows提供的API函数,编写程序, 解决生产者与消费者问题,实现进程的 互斥与同步。
线程创建
参数: lpThreadAttributes:其值决定返回的句柄是否可被子进程 继承。若为NULL,则句柄不能被继承。 dwStackSize:定义原始堆栈提交时的大小 (按字节计)。若 值为0,视为缺省情况,使用与调用线程同样的大小。 lpStarAddress:该指针表示远程进程中线程的起始地址。 该函数必须存在于远程进程中。 lpParameter:定义一个传递给该进程的32位值。 dwCreationFlags:定义控制进程创建的附加标志。若定义 了 CREATE_SUSPENDED 标志,线程创建时处于挂起 状态,并且直到 ResumeThread 函数调用时才能运行。 若该值为0,则该线程在创建后立即执行。 lpThreadld:指向一个32位值,它接受该线程的标识符。 返回值: 若函数调用成功,返回值为新线程的句柄;若函数调用失 败,返回值为NULL。
背景知识
本实验要求设计并实现一个进程,该进程拥有 一个生产者线程和一个消费者线程,它们使用 N个不同的缓冲区(N为一个确定的数值,例如 N=32)。需要使用如下信号量:
l 一个互斥信号量,用以阻止生产者线程和消费 者线程同时操作缓冲区列表;
l 一个信号量,当生产者线程生产出一个物品时 可以用它向消费者线程发出信号; l 一个信号量,消费者线程释放出一个空缓冲区 时可以用它向生产者线程发出信号;
– 如果成功就传回一个handle,否则传回NULL。
ReleaseSemaphore()
函数功能:该函数将指定信号对象的计数 增加一个指定的数量。 函数原型: ReleaseSemaphore( HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount); 返回值:
WaitForSingleObject()
函数功能:测试指定对象是否有信号或超时。 函数原型: DWORD WaitForSingleObject( HANDLE hHandle , DWORD dwMilliseconds) ; 参数:
– hHandle:等待对象句柄。 – dwMilliseconds:指定以毫秒为单位的超时间隔。
ReleaseMutex ()
函数功能:该函数释放指定互斥对象。 函数原型: ReleaseMutex(HANDLE hMutex); 参数:
– hMutex :互斥对象句柄。为 CreateMutex 或 OpenMutex函数的返回值。
返回值:
–如果函数调用成功,则返回值是非零值;如 果函数调用失败,则返回值为0。
工具/准备工作
在开始本实验之前,请回顾教科书的相关内容
需要做以下准备:
– 一台运行Windows 2000 /XP 操作系统的计算机
– 计算机中需安装Visual C++ 6.0专业版或企业版
#define N … //定义信号量 HANDLE m_S_Empty; // 生产者Semaphore HANDLE m_S_Full; // 消费者Semaphore HANDLE m_M_Mutex;//互斥 buf_type buffer[N]; //定义共享缓冲区 main(…) { … //创建生产者和消费者线程 CreateThread(…, Producer, …); CreateThread(…, Consumer, …); m_S_Empty = CreateSemaphore(NULL, N, N, NULL); //初始计数为N m_S_Full = CreateSemaphore(NULL, 0, N, NULL); //初始计数为0 m_M_Mutex = CreateMutex(NULL, FALSE, NULL); …}
背景知识
本实验要求设计在同一个进程地址空间内执行的
ቤተ መጻሕፍቲ ባይዱ
两个线程。生产者线程生产物品,然后将物品放
置在一个空缓冲区中供消费者线程消费。消费者
线程从缓冲区中获得物品,然后释放缓冲区。
生产者线程生产物品时,若无空缓冲区可用,生 产者线程必须等待消费者线程释放出一个空缓冲 区;消费者线程消费物品时,若缓冲区为空,消 费者线程将被阻塞,直到新的物品被生产出来。
终止线程
ExitThread
函数功能:该函数结束一个线程。
函数原型:
VOID ExitThread( DWORD dwExitCode );
参数:
dwExitCode : 定 义 调 用 线 程 的 退 出 代 码 。 使 用 GetExitCodeThread函数来检取一个线程的退出 代码。
备注
上述伪代码只是提供了一个解决问题的 思路,与Windows的同步原语无关。 可以根据需要选用Windows提供的同步 对象(包括信号量、互斥量、事件、临 界区)编写自己的代码。 该问题有许多解决方法,请认真研究 Windows的各种不同的同步对象,并在 自己的程序中做出适当的选择。
实验报告
每人独立一组,需要上交实验报告 实验报告包括实验目的、实验内容、主要程序 结构(附注释)、实验步骤、实验中遇到的问 题及解决方法等。 上交程序源代码。 源代码和实验报告一并打包后上交,其命名方 式为:班级_学号_姓名.rar (注:只需上交源代码,不需要上交生成的目标 文件及可执行文件。) 通过EMAIL地址上交:coignhln@