操作系统_创建线程利用互斥实现线程共享变量通信

上传人:pu****.1 文档编号:561950783 上传时间:2022-07-16 格式:DOCX 页数:24 大小:226.56KB
返回 下载 相关 举报
操作系统_创建线程利用互斥实现线程共享变量通信_第1页
第1页 / 共24页
操作系统_创建线程利用互斥实现线程共享变量通信_第2页
第2页 / 共24页
操作系统_创建线程利用互斥实现线程共享变量通信_第3页
第3页 / 共24页
操作系统_创建线程利用互斥实现线程共享变量通信_第4页
第4页 / 共24页
操作系统_创建线程利用互斥实现线程共享变量通信_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《操作系统_创建线程利用互斥实现线程共享变量通信》由会员分享,可在线阅读,更多相关《操作系统_创建线程利用互斥实现线程共享变量通信(24页珍藏版)》请在金锄头文库上搜索。

1、创建线程,利用互斥实现线程共享变量通信概述1.1课题目的和意义掌握线程创建和终止,加深对线程和进程概念的理解,会用同步与互斥方法实现线程之间 的通信。1.2内容和要求软件界面上点“创建线程”按钮,创建三个生产者线程(P1, P2, P3)和两个消费者线程(C1, C2),生产者和消费者线程共享一个长度为 2KB的环型公共缓冲区,生产者向其中投放消 息,消费者从中取走消息。只要缓冲区未满,生产者可将消息送入缓冲区;只要缓冲区未空, 消费者可从缓冲区取走一个消息。每个消息具下列结构格式:消息头(1B,固定为Oxaa),消息长度(1B),消息内容(nB),校验和(1B),检验和计算 方式为消息长度和

2、消息内容所有字节异或结果。每个生产者每隔n毫秒(n用随机数产生,1到100毫秒之间,间隔不固定)生产一个消息 加入缓冲区,并把消息产生时间和内容记录在一个文本文件中(或显示在列表框中)。P1每次生产的数据为26个大写字母,P2每次生产的数据为26个小写字母,P3每次生产的数据为10个 数字。每个消费者每隔n秒(n用随机数产生,1到5秒之间,间隔不固定)从缓冲区取走一个消 息。每消费一个消息需要将消费时间和消息内容记录在一个文本文件中(或显示在列表框中)。当用户按结束按钮时结束5个线程,并将5个文件内容显示出来进行对照。这期实是一个经典的生产者一消费者(Producer_consumer)进程(

3、线程)同步的问题。它描 述的是:有一群生产者进程在生产产品,并将此产品提供给消费者进程(线程)去消费。为使生产者进程和消费者进程(线程)能并发执行,在它们之间设置有个缓冲区的缓冲池,生产者进程(线程)可将它所生产的产品放入一个缓冲区中,消费者进程(线程)可从一个缓冲区取得一个产品消费。尽管所有的生产者进程和消费者进程(线程)都是以异步的方式运行的,但它们之间必须保持 同步,即不允许消费者进程(线程)到一个空缓冲区去取产品,也不允许生产者进程 (线程)向一个 已装有消息尚未被取走产品的缓冲区投放产品。如下图所示:.消彷希1消费者2訂个大小相尊的缓冲区,毎 个缓冲赳用冷放一个消息1.3线程所采用的

4、同步方法同步是多线程中的重要概念同步的使用可以保证在多线程运行的环境中,程充不会产生设 计之外的结果同步的实现方式有两种,同步方法和同步块线程在执行同步方法是具有排它性的.当任意一个线和进入到一个对象的任意一个同步方 法时,这个对象所有同步方法都被锁定,在些期间,期他任何线程都不能访问这个对象的任意一 个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导至它释放了该对象的同步锁这后.在一个对象被某个线程锁定之后,其他线程是可以访问.同步的有几种实现方法,分别是:wait():使一个线程处于等待状态,并且释放所有持有的对象lock.sleep():使一个正在运行的线程处于睡眠状态,

5、是一个静态方法,调用此方法要捕捉In terruptedExceptio n异常。n otify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤 醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。All notity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。1.4开发工具平台开发平台:window XP 开发工具:VC+数据定义和详细说明1数据定义设计PV操作算法,用信号量机制实现生产者与消费者同步与互斥问题,并与无 PV情况下 进行对比。定义20个缓冲区,将其初始化为0。调用随机函数rand ()

6、生成随机数,把随机数 通过生产者放入缓冲区。若缓冲区满则其值非0。当消费者从缓冲区中去数后缓冲区值变为0。程序可显示缓冲区中的全部内容,方便观察生产者与消费者的行为。程序可通过设置sleep(time) 中time的值来控制生产者与消费者的执行顺序。2详细说明为了实现生产者与消费者同步与互斥的问题,该程序用记录型信号量机制来实现。假定在生产者与消费者之间,利用一个公共的缓冲池来进行通信,生产者将所生产的信息 放入其中,消费者cognitive缓冲池中取得消息来消费,该缓冲池具有n个缓冲区,其编号为0, 1, 2, 3,n-1 ;设置一个互斥信号量 mutex,用于实现诸进程对缓冲池的互斥使用,

7、其初值 为1,利用资源信号量empty,表示缓冲池中空缓冲区的数目,其初值为n; full分别表示缓冲池中满缓冲区的数目,其初值为0.又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入由指针in所指的缓冲区;只要缓冲池未空,消费者变可以从由指针out所指示的缓冲区中,取走一个消息。对生产者消费者的问题可以描述如下:Var metux,empty,full:semaphore=1, n,0;Buffer:arrayO, n-1 of item;ln,o ut:i nteger:=0;Begi n:Pabegi nProducer:begi nRepeatProducer an

8、 item n extp;P(empty);P(mutex);buffer(i n):=nextp; in :=(i n+1)mod n;V(mutex);V(full);Un til false;EndCon sumer:beg inRepeatP(full);P(mutex); n extc:= buffer(out); out:=(out+1)mod n; V(mutex);V(empty); Un til false;EndPare ndEnd实现思想和设计流程1实现思想我们把系统中使用某一类资源的进程(线程)称为该资源的消费者,而把释放同类资源的进 程称为该资源的生产者。例如在计算进

9、程 (线程)与打印进程(线程)公用一个缓冲区时,计算进 程(线程)把数据送入缓冲区,打印进程(线程)从缓冲区中取数据打印输出,因此,计算进程相 当于数据资源的生产者,而打印进程相当于消费者,二者之间必须保持同步。基于这一问题, 我们将使用生产者和消费者这一同步机制算法来处理该问题 2设计流程首先,我们知道,生产者一消费者问题是一个同步问题。即生产者和消费者之间应满足如 下条件:2.1消费者想接收数据时,有界缓冲区中至少有一个单元是满的。2.2生产者想发送数据时,有界缓冲区中至少有一个单元是空的。另外,由于有界缓冲区是临界资源,因此,各生产者进程和各消费者进程之间必须互斥。 其次,我们还必须考虑

10、 面临的问题是属于进程互斥还是进程同步,或是互斥与同步的混合问题。 然后根据共享资源的数量以及使用共享资源的规则正确的定义信号量及其初值。最后,还要对结果进行分析处理。若结果中生产和消费进程都已处理完时,但还可能出现 以下两种情况:一是还有生产进程,但没有空缓冲,且消费进程暂时已完,所以此时,只能结 束等待新的消费进程产生空缓冲。二是还有消费进程,但没有了满缓冲,且生产进程暂时已完, 此时,只能结束等待新的生产进程来输入数据,产生新的满缓冲等。在程序中应能作出相应的 判断和处理。本程序的执行是在C+勺环境中通过手动输入生产者和消费者线程的运行速度来控制程序 的运行的。为了实现生产者进程能把生产

11、出来的产品正确的存入缓冲区,和消费者进程能够从 缓冲区中取产品进行消费,防止因等待资源而出现死锁的现象,首先设置两个时间:生产者生 产一个产品后等待的时间t1,和消费者消费一个产品后等待的时间t2,来控制生产者和消费者 进程执行的速度。其函数原形是sleep(tl)和sleep(t2)其中t1、t2指定义挂起执行线程的时间,以毫秒为 单位,取值为0时,该线程将余下的时间片交给处于就绪状态的同一优先级的其他线程。若没 有处于就绪状态的同一优先级的其他线程,则函数立即返回。3程序流程图创建进程模拟生产者消费者Y4关键代码分析本程序采用了 MFC可视化界面来完成,现在给出关键代码来分析 4.1开始创

12、建线程原代码:void CMultiThreadDIg: On Start() /开始创建线程hMutex=CreateMutex(NULL,FALSE,NULL); 创建互斥对象threadC on troller=1;check=TRUE;检测标识HWND hWnd=GetSafeHw nd();/得到控制权AfxBegi nThread(ThreadProc,hWnd,THREAD_PRIORITY_NORMAL)启用生产者线程 1(P1)AfxBeginThread(ThreadProc2,hWnd,THREAD_PRIORITY_NORMAL)启用生产者线程 2(P2)AfxBegi

13、nThread(ThreadProc3,hWnd,THREAD_PRIORITY_NORMAL)启用生产者线程 3(P3)AfxBeginThread(Thread_consumer,hWnd,THREAD_PRIORITY_NORMAL)启用 消费者线程 1(S1)AfxBeginThread(Thread_consumer2,hWnd,THREAD_PRIORITY_NORMAL)启 用消费 者线程 2(S2)原码功能:主要创建生产者和消费者线程,创建互斥对象,创建窗体对象主要函数功能:4.1.2 CreateMutex()函数功能:该函数是创建有名或者无名的互斥对象。函数原型:HANDL

14、E CreateMutex(LPSECURITY_ATTRIBUTES IpMutexAttributesBOOL blnitialOwner, LPCTSTR lpName);参数:lpMutexAttributes :指向SECURITY_ATTRIBUT结S勾的指针,该结构决定子进程是 否能继承返回句柄。如果lpMutexAttributes 为NULL那么句柄不能被继承。在Windows NT中该结构的IpSecurityDescriptor成员指定新互斥对象的安全描述符。如果lpMutexAttributes 为NULL那么互斥对象获得缺省的安全描述符。bI nitialOw ner

15、 :指定互斥对象的初始所属身份。如果该值为TRUE并且调用者创建互斥对象,那么调用线程获得互斥对象所属身份。否则,调用线程不能获得互斥对象所属身份。判断 调用者是否创建互斥对象请参阅返回值部分。lpName:指向以NULL结尾的字符串,该字符串指定了互斥对象名。该名字的长度小于MAX_PAT且可以包含除反斜线路径分隔符( )以外的任何字符。名字是区分大小写的。如果与已存在的有名互斥对象名相匹配,那么该函数要求用权限访问已存在的对象。在这种情况下,由于参数己被创建进程所设置,该参数被忽略。如果参数不为,它决定句柄是否解除继承,但是其安全描述符成员被忽略。如果lpName为NULL那么创建的互斥对象无名。如果lpName与已存在的事件、信号量、可等待定时器、作业、或者文件映射对象的名字相匹配,那么函数调用失败,并且GetLastError函数返回ERPORNVALID_HANDL其原因是这些 对象共享相同的名字空间。返回值:如果函数调用成功,返回值是互斥对象句柄;如果函数调用之前,有名互斥对象 已存在,那么函数给已存在的对象返回一个句柄,并且函数GetLastError返回ERROR_AL

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号