欢迎来到天天文库
浏览记录
ID:41614021
大小:58.14 KB
页数:4页
时间:2019-08-28
《同步实现和创建进程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实现线程同步的不同办法1.利用互斥对象实现线程同步。2.利用事件対象实现线程的同步。3.利用关键代码段实现线程的同步。1、互斥对象实现线程同步:互斥对象属于内核对象。它包含了一个使用数量,一个线程ID,—个计数器。英中,用于ID川于表明系统屮的哪个线程当前拥有互斥对象,计数器川于指明该线程拥有互斥对象的次数。HANDLECreateMutex(LPSECURITY_ATTRIBUTESIpMutexAttributes,BOOLblnitialOwner,LPCTSTRIpName2、事件对象实现线程同步:事件对象也属于内核对象,包括三个成员;使用计数;用于指
2、明该事件是一个自动重置的事件还是一个人工重置的事件。当人T•重置的事件对象得到通知时,等待该事件对象的所冇线程均变为可调度线程。当一个自动重置的事件对彖得到通知的时候,等待改事件对彖的线程中只有一个线程变为可调度线程,同时操作系统会将该事件对彖设置为无信号状态,这样,当对所保护的代码执行完成后,需要调用SetEvent函数将该事件刈豫设置为有倍号状态。而人工重置的事件对象,在一•个线程得到该事件对象Z后,操作系统并不会将该事件对象设置为无信号状态,除非显示地调用ResetEvent函数将其设置为无信号的状态,否则该对彖会一直为有信号状态。HANDLECreat
3、eEvent(LPSECURITY_ATTRIBUTESIpEventAttributeSzBOOLbManuaiResetzBOOLblnitia丄State,LPTSTRloWame第二个参数,True:表示为人工璽置事件对象;False:表示为白动重置事件对象。笫三个参数,Ti-ue:表示该事件初始是有信号状态;False:表示该事件初始是无信号状态。BOOLSetEvent(HANDLEhEvent);把指定的事件对象设置为信号状态。BOOLResetEvent(HANDLEhEvent);把指定的事件对象设置为无信号状态。但是一般为了实现线程间的同步
4、,不应该使用人工重置的事件对象,而应该使用自动重置的事件对象。也就是在CreateEvent的第二个参数为False03、关键代码段:关键代码段,也叫临界区,工作在用户方式下。它是指一个小代码段,在代码能够执行询,它必须独占对某些资源的访问权。通常把多线程中访问同一种资源的那部分代码当做关键代码段。voidlnitializeCriticalSection(LPCRITICAL_SECTIONIpCriticAlSGCtion);进入关键代码段z前要初始化一个这样的关键代码段,町以调用上面这个函数实现。参数为out类型,是一个指向CRITICAL.SECTIO
5、N结构体的指许。所以在使用前要构造一个CRITICAL_SECTION的结构体类型对象,然后将该对象的地址传递给InitializeCriticalSection函数。v注意>CRITICAL_SECTION的对象要为全局对象,首先在main函数屮调用InitializeCriticalSection方法创建临界区,并在退出前调用DeleteCriticalSection函数释放没有被任何线程使用的临界区对彖的所有资源;在线程中要用EnterCritialSection函数进行等待,访问结束后要用LeaveCritialSection,释放指定临界区的所有权。
6、三种同步方式的比较:1)互斥对彖和事件对彖都属于内核对彖,利川内核对象进行线程同步,速度较慢,但利用互斥对彖和事件对彖这样的内核对象,可以在多个进程中的各个线程Z间进行同步。2)关键代码工作在用户模式下,同步速度较快,但在使用关键代码段是,很容易进入死锁状态,因为在等待进入关键代码段时无法设置超时值。通常,在编写多线程程序并实现线程同步时,首选关键代码段,由于它的使川比较简单。如果是再mfc的程序中,"J以在类的构造函数中调用InitializeCriticalSection函数,在类的析构函数中调用DeleteCriticalSection函数。不过在多临界
7、区刈•象时要注意防止线程死锁的发生。如果需要在多个进程间的各个线程间实现同步的话,可以使用互斥对象和事件对象。创建线程的方法CWinThread*AfxBeginThread(AFX_THREADPROCp/hThreac/ProQ〃不能为空,且一定要uint_cdeclMyControllingFunction(LPVOID//pParam)声明LP/ODpParam,intnPno口3=THREAD_PRI0RITY_N0RMAL,UINTnStackSize-Q,DWORDSwCreateFlags^O,LPSECURITY_ATTRIBUTES/p
8、Secur/tyi4ttrs=NULL
此文档下载收益归作者所有