欢迎来到天天文库
浏览记录
ID:34074655
大小:50.58 KB
页数:9页
时间:2019-03-03
《实验二进程(线程)的同步与互斥》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
实验二进程(线程)的同步与互斥一、实验目的1.掌握基本的同步与互斥算法,理解生产者消费者模型。2.学习使用Windows中基本的同步对彖,掌握相关API的使用方法。3.了解Windows中多线程的并发执行机制,实现进程的同步与互斥。二、实验内容1.实验内容以生产者/消费者模型为依据,在Windows环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。Buffer(共享内存)消费者2.实验要求•学习并理解生产者/消费者模型及其同步/互斥规则;•学习了解Windows同步对象及其特性;•熟悉实验环境,掌握相关API的使用方法;•设计程序,实现生产者/消费者进程(线程)的同步与互斥;三、相关API的功能及使用我们利用WindowsSDK提供的API编程实现实验题目要求,而VC中包含有WindowsSDK的所有工具和定义。要使用这些API,需要包含堆这些两数进行说明的SDK头文件一—最常见的是Windows.h(特殊的API调用还需要包含其他头文件)。下面给出的是本实验使用到的API的功能和使用方法简单介绍。(1)CreateThread•功能一一创建一个在调用进程的地址空间中执行的线程•格式HANDLECreateThread(LPSECURITY_ATTR1BUTESIpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINEIpStartAddress,LPVOIDIpParamiter, DWORDdwCreationFlags,LpdwordlpThread);•参数说明IpThreadAttributes——指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize定义原始堆栈大小。IpStartAddress——指向使用LPTHRAED_START_ROUTINE类型定义的函数。IpParamiter定义一个给进程传递参数的指针。dwCreationFlags定义控制线程创建的附加标志。lpThread保存线程标志符(32位)(2)CreateMutex•功能一一创建一个命名或匿名的互斥量对象•格式HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,BOOLblnitialOwner,LPCTSTRlpName);•参数说明IpMutexAttributes必须取值NULL。blnitialOwner——指示当前线程是否马上拥有该互斥量(即马上加锁)。IpName互斥量名称。(3)CreateSemaphore•功能一一创建一个命名或匿名的信号量对象•格式HANDLECreateSeniaphore(LPSECURITY_ATTRIBUTESIpSemaphoreAttributes,LONGUnitialCount,LONGIMaximumCount,LPCTSTRIpName);•参数说明IpSemaphoreAttributes必须取值NULL。IlnitialCount信号量的初始值。该值大于等于0,但小于等于IMaximumCount指定的最大值。IMaximumCount信号量的最大值。IpName——信号量名称。(4)WaitForSingleObject•功能一一使程序处于等待状态,直到信号量hHandle出现(即其值大于0)或超过规定的等待时间•格式DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);•参数说明 hHandle——信号量指针。dwMilliseconds——等待的最长时间(INFINITE为无限等待)。 (2)ReleaseSemaphore•功能一一对指定信号量加上一个指定大小的量。成功执行则返冋非0值•格式BOOLReleaseSemaphore(HANDLEhSemaphore,LONGIReleaseCount,LPLONGIppreviousCount);•参数说明hSemaphore信号量指针。1ReleaseCount信号量的增量。IppreviousCount保存信号量当前值。(3)ReleaseMutex•功能一一打开互斥锁,即把互斥量加1。成功调用则返回0•格式BOOLReleaseMutex(HANDLEhMutex);•参数说明hMutex互斥量指针。四、示例稈序#include#include#include#include#include〃最大线程数〃延迟时间的亳秒值〃缓冲区长度#defineMAX_THREAD_NUM64#defineINTE_PER_SEC1000constintSIZE_OF_BUFFER=10;intProductID=0;〃产品号intConsumelD=0;〃将被消耗的产品号intin=0;〃产品进缓冲区时的缓冲区下标intout=0;〃产品出缓冲区时的缓冲区下标intg_buffer[SIZE_OF_BUFFER];〃缓冲区是个循环队列HANDLEg_hMutex;HANDLEg_hFullSemaphore;〃公有信号量,用于线程间的互斥〃生产者的私有信号量,当缓冲区满时迫使生产者等待HANDLEg_hEmptySemaphore;〃消费者的私有信号量,当缓冲区空时迫使消费者等待boolrunning=true;〃判断程序能否继续执行的逻辑值〃定义一个结构体用于存储线程的信息structThreadinfointserial;〃线程号 charentity;〃线程类别(生产者或消费者)doubledelay;〃等待时间doublepersist;//操作时间);〃生产者voidProducedvoid*p){〃定义变量用于存储当前线程的信息DWORDm_delay;DWORDm_persist;intm_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«n生产者线程,,«m_serial«H请求独占缓冲区.n«endl;WaitForSingleObject(g_hMutex,INFINITE);Sleep(m_delay);〃延迟等待〃生产一个产品cout«n生产者线程”《m_serial«H生产H«+4-ProductID«°号产品成功«endl;cout«n生产者线程”vvm_sedalvv“请求将产品“vvProductlDvv“投入缓冲区.u«endl;〃把新生产的产品放入缓冲区g_buffer[in]=ProductID;in=(in+1)%SIZE_OF_BUFFER;Sleep(m_persist);〃操作等待cout«"生产者线程”serial;m_delay=(DWORD)(((ThreadInfo*)(p))->delay*INTE_PER_SEC);m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC);while(running){〃P操作cout«n消费者线程”«m_serial«,'请求消费."«endl;WaitForSingleObject(g_hFullSemaphore,INFINITE);cout«°消费者线程,,«m_serial«u请求独占缓冲区.H«endl;WaitForSingleObject(g_hMutex,INFINITE);Sleep(m_delay);〃延迟等待〃从缓冲区屮収出一个产品cout«°消费者线程“《m_serialvv“请求取出一个产品.H«endl;ConsumelD=g_buffer[out];g_bufferfoutl=0;out=(out+1)%SIZE_OF_BUFFER;cout«u消费者线程"
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处