博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

(zz)Event 和 Mutex的区别

Posted on 2011-08-26 13:11  yuanzfy  阅读(1466)  评论(0)    收藏  举报

事件 事件是用来同步地位不相等的线程的,事件可以用来使一个线程完成一件事情,然后另外的线程完成剩下的事情。事件的使用很灵活,自动事件的激发态是由人工来控制的,而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      :表示等待对象句柄是一个无效句柄。