如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
Windows临界区,内核事件,互斥量,信号量。临界区,内核事件,互斥量,信号量,都能完成线程的同步,在这里把他们各自的函数调用,结构定义,以及适用情况做一个总结。一.临界区CRITICAL_SECTION:适用范围:它只能同步一个进程中的线程,不能跨进程同步。一般用它来做单个进程内的代码快同步,效率比较高。相关结构:CRITICAL_SECTION_critical相关方法://初始化,最先调用的函数。一般windows编程都有类似初始化的方法InitializeCriticalSection(&_critical)//释放资源,确定不使用_critical时调用,一般在程序退出的时候调用。//如果以后还要用_critical,则要重新调用InitializeCriticalSectionDeleteCriticalSection(&_critical)//把代码保护起来。调用此函数后,他以后的资源其他线程就不能访问了。EnterCriticalSection(&_critical)//离开临界区,表示其他线程能够进来了。//注意EnterCritical和LeaveCrticalSection必须是成对出现的!当然除非你是想故意死锁!LeaveCriticalSection(&_critical)例子:临界区#include"stdafx.h"intthread_count=0;/*Mutexmutex1;*/CRITICAL_SECTIONg_cs;DWORDCALLBACKthread_proc(LPVOIDparams){for(inti=0;i<10;++i){//synchronized(mutex1)EnterCriticalSection(&g_cs);{for(charc='A';c<='Z';++c){printf("%c",c);}printf("\n");}LeaveCriticalSection(&g_cs);}thread_count--;return0;}int_tmain(intargc,_TCHAR*argv[]){InitializeCriticalSection(&g_cs);thread_count=4;CreateThread(0,0,thread_proc,0,0,0);CreateThread(0,0,thread_proc,0,0,0);CreateThread(0,0,thread_proc,0,0,0);CreateThread(0,0,thread_proc,0,0,0);while(thread_count)Sleep(0);getchar();DeleteCriticalSection(&g_cs);return0;二.内核事件Event:适用范围:多用于线程间的通信,可以跨进程同步。相关结构:HANDLEhEvent;相关方法://初始化方法,创建一个事件对象,第一个参数表示安全属性,一般情况下,//遇到这类型的参数直接给空就行了,第二个参数是否是人工重置。(内核时间有两种工作模式://人工重置和自动重置。其区别会在下面提到。)。第三个参数是初始状态,第四个参数事件名称。hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//等待单个事件置位,即线程会在这个函数阻塞直到事件被置位,SetEvent。//如果是自动重置事件,则在此函数返返回后系统会自动调用ResetEvent(hEvnet),//重置事件,保证其他线程不能访问。//如果是人工重置事件,则在此函数返回以后,系统的其他线程能继续访问。//第二个参数说明等待事件,INIFINET表示一直等待。WatiForSingleObject(hEvent,INIFINET)//置位事件,只要使事件置位线程才能进去访问。即WatiForSingleObject(hEvent,INIFINET)才返回SerEvent(hEvent);//重置事件,使得WatiForSingleObject()不返回ResetEvent(hEvent)//等待多个事件对象。参数nCount指定了要等待的内核对象的数目,存放这些内核对象的数组由lpHandles//来指向。fWaitAll对指定的这nCount个内核对象的两种等待方式进行了指定,//为TRUE时当所有对象都被通知时函数才会返回,为FALSE则只要其中任何一个得到通知就可以返回。//dwMilliseconds在这里的作用与在WaitForSingleObje