欢迎来到天天文库
浏览记录
ID:21926026
大小:136.00 KB
页数:10页
时间:2018-10-25
《windows线程同步与互斥》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验4Windows线程同步和互斥实验目的1、了解Windows内核对线程同步的支持。2、了解C的线程函数库及Windows基本的线程API函数的使用。3、进一步理解线程的同步控制原理。预备知识一、Windows线程同步机制(注:互斥是同步的一种特例)n事件(Event)n临界区(CriticalSection)n互斥量(Mutex)n信号量(Semaphore)1、是否能跨进城使用?互斥量、信号量、事件都可以跨进程来实现同步数据操作。临界区只能用在同一进城的线程间互斥,因为临界区无名(无句柄)。如果只为了在进程内部用的话,使用临界区会带来速度上的优势并能够减少资源占用量。2、
2、其它区别临界区:访问临界资源的代码段。课堂上讲过。(存钱、取钱的例子还记得吗?)互斥量:资源独占使用信号量:资源计数器事件对象:可以通过“通知”的方式来保持线程的同步。事件是WIN32中最灵活的线程间同步机制。事件存在两种状态:激发状态(SignaledorTrue)未激发状态(UnsignaledorFalse)。3、详细解释:(见下面实验内容每个程序前)二、VC++(略)要用到的系统调用1、 2、实验内容1、用事件(Event)对象来进行线程同步n事件可分为两类:n手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent
3、来进行设置。n自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。n_beginthread函数:创建一个线程。所在库文件:#include uintptr_t_beginthread( void(*start_address)(void*), unsignedstack_size, void*arglist ); 返回值: 假如成功,函数将返回一个处理信息对这个新创建的线程。如果失败_beginthread将返回-1。 start_address 新线程的起始地址,指向新线程调用的函数的起始地址stack_size
4、stack_size新线程的堆栈大小,可以为0arglistarglist传递给线程的参数列表,无参数是为NULL nCreateEvent函数:创建事件对象windows.hHANDLECreateEvent( //SECURITY_ATTRIBUTES结构指针,可为NULLLPSECURITY_ATTRIBUTESlpEventAttributes, BOOLbManualReset, //手动/自动 //TRUE:在WaitForSingleObject后必须手动调用ResetEvent清除信号 //FALSE:在WaitForSingleObject后,系统自动清除事
5、件信号 BOOLbInitialState,//初始状态 LPCTSTRlpName//事件的名称);n使用“事件”机制应注意以下事项:n如果跨进程访问事件,必须对事件命名,在对事件命名的时候,要注意不要与系统命名空间中的其它全局命名对象冲突;n事件是否要自动恢复;n事件的初始状态设置。n由于event对象属于内核对象,故进程B可以调用OpenEvent函数通过对象的名字获得进程A中event对象的句柄,然后将这个句柄用于ResetEvent、SetEvent和WaitForMultipleObjects等函数中。此法可以实现一个进程的线程控制另一进程中线程的运行,例如:HAN
6、DLEhEvent=OpenEvent(EVENT_ALL_ACCESS,true,"MyEvent");ResetEvent(hEvent);验证程序:3个线程。主线程创建2个线程。一读,一写。写线程(并不真写,只是输出writing等字符串)完成后,读线程才能读,读线程完成后,主线程才能结束。新建一个Win32控制台应用程序项目(win32consoleapplication)#include"stdafx.h"#include#include#include#includeHANDL
7、EevRead,evFinish;//全局变量,事件对象的句柄voidReadThread(LPVOIDparam){WaitForSingleObject(evRead,INFINITE);//等待evRead被激活cout<<"Reading...读完成,唤醒主线程"<
此文档下载收益归作者所有