事件 事件是用来同步地位不相等的线程的,事件可以用来使一个线程完成一件事情,然后另外的线程完成剩下的事情。事件的使用很灵活,自动事件的激发态是由人工来控制的,而Mutex在释放(releaseMetux)后就一直处于激发态,直到线程WaitForSingleObject。事件可以用来控制经典的读写模型和生产者和消费者模型。相应的方式为,生成者等待消费者的消费,再消费者消费完后通知生产者进行生产。 Mutex Mutex是排他的占有资源,一般用于地位相等的现在进行同步,每个线程都可以排他的访问一个资源或代码段,不存在哪个线程对资源访问存在优先次序。一个线程只能在Mutex处于激发态的时候访问被保护的资源或代码段,线程可以通过WaitForSingelObject来等待Mutex,在访问资源完成之后,ReleaseMutex释放Mutex,此时Mutex处于激发态。Mutex具有成功等待的副作用,在等待到Mutex后,Mutex自动变为未激发态,直到调用ReleaseMutex使Mutex变为激发态为止。自动事件也具有成功等待的副作用。手动事件没有,必须ResetEvent使手动事件变为未激发态。进程和线程也没有成功等待的副作用。当线程或者进程函数返回时,线程内核对象变为激发态,但WaitForSingleObject并没有使线程或者进程的内核对象变为未激发态。 总之,事件一般用于控制线程的先后顺序,而Mutex一般用于排他的访问资源。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/anjen/archive/2009/10/26/4727791.aspx
Event使用
首先创建事件:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
BOOL bManualReset, // 复位方式,1为手动复位,0为自动复位
BOOL bInitialState, // 初始状态,0为不可用状态即无信号,1为可用状态即有信号
LPCTSTR lpName // 对象名称
);
SetEvent设置为有信号。ResetEvent设置为无信号。
WaitForSingleObject来等待Event变为有信号:
DWORD WaitForSignalObject(HANDLE hObject, DWORD dwMilliseconds);
返回值有以下几种:
WAIT_OBJECT_0 :表示等待对象已经变为有信号状态,如果设置为自动复位,还会把此信号再次变为无信号状态。
WAIT_TIMEOUT :表示等待超时
WAIT_FAILED :表示等待对象句柄是一个无效句柄。
 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号