版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
管程机制解决互斥与同步问题一、信号量机制解决互斥与同步问题信号量机制信号量(semaphore)机制
解决并发进程同步的工具P操作表示同步进程发出的检测信号量操作,检测是否能够使用临界资源V操作表示访问完临界资源的进程通知等待进程已经完成了临界资源的访问,将临界资源释放。
经典互斥与同步问题回顾
生产者-消费者问题读者-写者问题哲学家进餐问题生产者-消费者问题生产者P:Wait(empty);Wait(mutex);Buffer(in)=nextp;in:=(in+1)modn;Signal(mutex);Signal(full);消费者C:Wait(full);Wait(mutex);netxc=buffer(out);out:=(out+1)modn;Signal(mutex);Signal(empty);mutex,full,empty:semaphoremutex:=1;full:=0;empty:=n;读者-写者问题(读者优先)读者R:Wait(rmutex);rcount++;if(rcount==1)Wait(wmutex);Signal(rmutex);Read_Action();Wait(rmutex);rcount--;if(rcount==0)Signal(wmutex);Signal(rmutex);写者W:Wait(wmutex);Write_Action();Signal(wmutex);rmutex,wmutex:semaphorermutex:=1;wmutex:=1;rcount:intrcount:=0;哲学家进餐问题哲学家i(i=0,1..5)thinking();Wait(fork[i]);Wait(fork[(i+1)mod5])eating();Signal(fork[i]);Signal(fork[(i+1)mod5])arrayoffork[]:semaphorefork[]:={1,1,1,1,1};思考,怎么解决死锁问题?同步对象同步对象是指Windows/Linux中用于实现同步与互斥的实体,包括互斥量(Mutex)、信号量(Semaphore)、临界区(CriticalSection)和事件(Events)等。本实验中使用到信号量、互斥量和临界区三个同步对象。实验方案设计以读者-写者(读者优先)为例:1.创建若干线程分别模拟读者操作和写者操作2.读线程间和写线程间对各自局部共享资源的访问修改采用Mutex对象,结合WaitForSingleObject保证互斥操作。3.读线程与写线程争用全局临界资源采用临界区(CriticalSeciton)。4.统管读写线程的线程采用WaitForMultipleObjects保证等待所有的线程结束。
创建线程函数CreateThread功能:该函数创建一个在调用进程的地址空间中执行的线程。若函数调用成功,返回值为新线程的句柄;若函数调用失败,返回值为NULL。格式:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlag,LPDWORDlpThreadId);参数说明:lpThreadAttributes—指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize—定义原始堆栈大小。lpStartAddress—指向使用LPTHRAED_START_ROUTINE类型定义的函数。lpParamiter—定义一个给进程传递参数的指针。dwCreationFlags—定义控制线程创建的附加标志。lpThread—保存线程标志符(32位)退出线程函数ExitThread功能:该函数结束一个线程格式:VOIDExitThread(DWORDdwExitCode);参数说明:dwExitCode—调用线程的退出代码创建互斥量函数CreateMutex功能:函数创建有名或者无名的互斥对象。如果函数调用成功,返回值是互斥对象句柄;如果函数调用之前,有名互斥对象已存在,那么函数给已存在的对象返回一个句柄。格式:HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,BOOLbInitialOwner,LPCTSTRlpName);参数说明:lpMutexAttributes—取值NULL。bInitialOwner—指示当前线程是否马上拥有该互斥量(即马上加锁)。lpName—互斥量名称。释放互斥量函数ReleaseMutex功能:释放互斥对象的控制权。格式:BOOLWIANPIReleaseMutex(HANDLEhMutex);参数说明:hMutex—互斥对象句柄。返回值:TRUE表示成功,FALSE表示失败。注:相当于我们的V操作创建信号量函数CreateSemaphore功能:创建一个新的信号量。格式:HANDLECreateSemaphore( LPSECURITY_ATTRIBUTESlpSemaphoreAttributes, LONGlInitialCount,LONGlMaximumCount,LPCTSTRlpName);参数说明:lpSemaphoreAttributes——用于定义信号量的安全特性。lInitialCount——设置信号量的初始计数。lMaximumCount——设置信号量的最大计数。lpName——指定信号量对象的名称。释放信号量函数ReleaseSemaphore功能:函数用于对指定的信号量增加指定的值。格式:BOOLReleaseSemaphore(HANDLEhSemaphore,
LONGlReleaseCount,
LPLONGlpPreviousCount);参数说明:hSemaphore——所要释放的信号量句柄。lReleaseCount——所要释放信号量的数目。lpPreviousCount——指向返回信号量上次值的变量的指针,如果不需要信号量上次的值,那么这个参数可以设置为NULL。注:相当于我们的V操作使用临界区资源的相关函数VOIDInltlallzeCriticalSection(LPCRITICAL_SECTIONIpCritiCalSection);函数功能:该函数初始化临界区对象。返回值:无。
VOIDEnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);函数功能:该函数是等待指定临界区对象的所有权。当调用线程被赋予所有权时,该函数返回。返回值:无。VOIDLeaveCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);函数功能:该函数释放指定临界区对象的所有权。返回值:无。
等待同步对象函数WaitForSingleObject功能:使程序处于等待状态,直到信号量hHandle出现(即其值大于等于1)或超过规定的等待时间。格式:DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);参数说明hHandle——同步对象指针。dwMilliseconds——等待的最长时间(INFINITE为无限等待)。注:相当于我们的P操作等待所有线程完成函数waitForMultipleObjects功能:WaiForMultipleObjects函数当下列条件之一满足时返回:(1)任意一个或全部指定对象处于信号态;(2)超时间隔已过。格式:DWORDwaitForMultipleObjects(DWORDnCount,CONSTHANDLE*lpHandles,BOOLfWaitAll,IDWORDdwMilliSeconds);参数说明:nCount——句柄的数量
最大值为MAXIMUM_WAIT_OBJECTS(64)HANDLE——句柄数组的指针。
HANDLE类型可以为(Event,Mutex,Process,Thread,Semaphore)数组
bWaitAll——等待的类型,如果为TRUE则等待所有信号量有效在往下执行,FALSE当有其中一个信号量有效时就向下执行。
dwMilliseconds——超时时间
超时后向执行。
如果为WSA_INFINITE永不超时。如果没有信号量就会在这死等。
输入数据格式及运行效果测试数据文件的例子:1R352W453R524R655W5.13提示:由于牵涉格式的问题,最好在文件中读取输入数据。Shell脚本运行过程编写shell脚本使用任意编辑器(gedit、vim、nano等)编写脚本添加执行权限:chmodu+xtest.sh运行脚本:./test.sh运行脚本的几种方式sh脚本名:sh只执行bash,读文件,只需r权限;开启新的儿子shell运行脚本./脚本名
:当前目录下该脚本,作为可执行程序运行,需x权限,每次开启新的儿子shell运行脚本.脚本名:.是一个命令,不开启儿子shell,当前shell运行代码实例-初始化操作代码实例-主线程代码实例-主线程代码实例-读者线程代码实例-写者线程思考试把控制读/写的全局临界资源用CriticalSection换成互斥量mutex,看看实验结果有什么变化,并且查阅相关资料说明原因。
实验内容题目1:用PV信号量实现读者-写者问题(写者优先)程序。题目2:用PV信号量实现生产者与消费者问题。题目3:用PV信号量实现哲学家进餐问题,要求解决死锁问题。题目4:江安北和江安南有一座小桥,小桥中间宽两边窄,中间每次最多允许两人通过,两边每次最多允许一人通过,使用PV信号量实现过此桥的程序。实验要求1.每人做一道题2.学号末2位模4所得结果+1为该生所做题目号实验:PV信号量解决互斥与同步问题二、管程机制解决互斥与同步问题管程的定义管程的定义:一组数据结构和数据结构上的一组相关操作被称为管程。
管程(monitor):新的同步机制
用管程解决同步问题比用信号量解决同步问题更加简单。
管程机制作为同步工具,便于在高级语言编程中实现。
管程的组成管程由4部分组成:
管程的名称
局部于管程内部的共享数据结构说明
对该数据结构进行操作的一组过程
对局部于管程内部的共享数据设置初始的语句管程的结构管程只有一个入口和一个出口并发进程在管程外等待调用管程中的过程如果进程在管程中不能访问临界资源,则在管程中阻塞等待访问完临界资源的进程将其唤醒
利用管程实现进程同步的工具在通过管程实现进程同步时,必须设置同步工具。
1.wait2.Signal3.condition条件变量也是一种抽象的数据结构类型,对条件变量的操作仅仅是wait和Signal。一个进程被阻塞或挂起的原因可能有多个,因此在管程中可以设置多个条件变量,形式为:Varx,y:condition对条件变量的操作:x.waitx.signal条件变量
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。
管程的关键的要素是:1.一个互斥量,让所有的线程互斥地访问管程保护的变量2.若干个条件变量,表示相应的条件,可用于阻塞线程实验内容题目1:用管程机制实现读者-写者问题(写者优先)程序。题目2:用管程机制实现读者-写者问题,读者最大数目限制为20(读者优先/写者优先均可)。题目3:用管程机制量实现哲学家进餐问题,要求解决死锁问题。题目4:江安北和江安南有一座小桥,小桥中间宽两边窄,中间每次最多允许两人通过,两边每次最多允许一人通过,使用管程机制实现过此桥的程序。创建线程函数pthread_create功能:类Unix操作系统(Unix、Linux、MacOSX等)
的创建线程的函数。格式:intpthread_create(pthread_t*tidp,
pthread_attr*attr,
void*(*start_trn)(void*),
void*arg);参数说明:tidp——指向线程标识符的指针。attr——设置线程属性。start_trn——线程运行函数的起始地址。arg——运行函数的参数。返回值:若线程创建成功,则返回0。若线程创建失败,则返回出错编号。召回线程函数pthread_join功能:等待一个线程的结束。格式:intpthread_join(pthread_tthread,void**retval);参数说明:thread——线程标识符,即线程ID。retval——用户定义的指针,用来存储被等待线程的返回值。返回值:0代表成功。
失败,返回的则是错误号。说明:pthread_join()函数,以阻塞的方式等待thread指定的
线程结束。当函数返回时,被等待线程的资源被收回。
如果进程已经结束,那么该函数会立即返回。锁定互斥量函数pthread_mutex_lock功能:给互斥量加锁。格式:intpthread_mutex_lock(pthread_mutex_t*mutex);参数说明:mutex——互斥信号量指针。返回值:在成功完成之后会返回零。其他任何返回值都表示出现了错误。说明:当pthread_mutex_lock()返回时,该互斥锁已被锁定。线程调用该函数让互斥锁上锁,如果该互斥锁已被另一个线程锁定和拥有,则调用该线程将阻塞,直到该互斥锁变为可用为止。类似于我们的P操作。
释放互斥量函数pthread_mutex_unlock功能:给互斥量解锁。格式:intpthread_mutex_trylock(pthread_mutex_t*mutex);参数说明:mutex——需要解锁的互斥信号量指针。返回值:在成功完成之后会返回零。其他任何返回值都表示出现了错误。说明:释放互斥锁,与pthread_mutex_lock成对存在。
类似于我们的V操作。
等待信号量函数sem_wait功能:可以获得资源,使semaphore的值减1。如果调用sem_wait()时semaphore的值已经是0,则挂起等待。格式:intsem_wait(sem_t*sem);参数说明:sem——信号量资源指针。返回值:在成功完成之后会返回零。其他任何返回值都表示出现了错误。说明:所需头文件:<semaphore.h>。
类似于我们的P操作。
释放信号量函数sem_destroy功能:释放资源,使semaphore的值加1,同时唤醒挂起等待的线程。格式:intsem_destroy(sem_t*sem);参数说明:sem——信号量资源指针。返回值:在成功完成之后会返回零。其他任何返回值都表示出现了错误。说明:所需头文件:<semaphore.h>。
类似于我们的P操作。
等待条件变量函数pthread_cond_wait功能:等待条件变量,若相应的条件变量已被占用则阻塞线程等待,直到有其他线程释放该条件变量。格式:intpthread_cond_wait(pthread_cond_t*cond,pthread_mutex_t*mutex);参数说明:cond——条件变量指针。mutex——互斥信号量指针。返回值:成功则返回0,失败则返回出错编号。释放条件变量函数pthread_cond_signal功能:释放条件变量,唤醒一个等待在指定条件变量上的线程。格式:intpthread_cond_signal(pthread_cond_t*cond);参数说明:cond——将要释放的条件变量指针。返回值:成功则返回0,失败则返回出错编号。输入数据格式及运行效果测试数据文件的例子:1R352W453R5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信用分析师风险识别评优考核试卷含答案
- 往来款项账龄分析表
- 选矿脱水工创新方法强化考核试卷含答案
- 坚果果蔬籽加工工安全理论测试考核试卷含答案
- 柠檬酸原料粉碎工工作意识测试考核试卷含答案
- 声学计量员岗位责任制模拟考核试卷含答案
- 口腔修复体制作师技能理论竞赛考核试卷含答案
- 临床检验类设备组装调试工岗位实战考核试卷含答案
- 成品矿运送工岗位操作能力考核试卷含答案
- 厂矿用机车司机岗中操作规程考核试卷含答案
- 领取现金协议书样本
- 2026-2030中国心律管理系统行业市场发展趋势与前景展望战略分析研究报告
- 2026中级注册安全工程师《安全生产技术基础》培训课件
- 2025年海口市秀英区广播电视台(融媒体中心)人员招聘考试试题及答案解析
- 2026年浙江绍兴市轨道交通集团有限公司招聘笔试参考题库含答案解析
- 部编语文一年级(下册)课外阅读练习试题
- 2026年全国政府采购评审专家统一考试真题含答案
- 2026年4月自考13740环境行为与心理学试题
- 2025年安徽省初级注册安全工程师其他安全考试真题(附答案)
- 2026年特种设备超声波二级开卷测试卷完整版附答案详解
- 2026形势与政策课件中国风范 大国担当-在世界变局中推动构建新型大国关系
评论
0/150
提交评论