现在的位置: 首页 > 综合 > 正文

CSemaphore/CMutex/CCriticalSection/CEvent区别

2013年11月14日 ⁄ 综合 ⁄ 共 687字 ⁄ 字号 评论关闭

CSemaphore/CMutex/CCriticalSection/CEvent区别

如果某个线程必须等待某些事件发生后才能存取相应的资源,用CEvent;
如果一个应用同时可以有多个线程存取相应资源,用CSemaphore;
如果有多个应用(多个进程)同时存取相应资源,用CMutex,否则用CCriticalSection。 
CCriticalSection不是核心对象,其余几个都是

  互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。
  所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少
  资源占用量。
  因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。

  互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的
  对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有
信号状态。所以我们可以使用WaitForSingleObject来等待进程和线程退出。

  通过互斥量我们可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用
  户购买了一份三个并发访问许可的数据库系统,你的老板会要求你根据用户购买的访问许可数量来决定有多少个线
程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计
数器。
  事件,前面讲的信号灯和互斥量可以保证资源被正常的分配和使用,而事件是用来通知其他进程/线程某件操作已
  经完成。

抱歉!评论已关闭.