《Win32多线程程序设计》(4)--- 互斥器(Mutexes)

Win32 的Mutex 用途和critical  section 非常类似,但是它牺牲速度以增加弹性。或许你已经猜到了,mutex 是MU Tual EXclusion 的缩写。一个时间内只能够有一个线程拥有mu tex,就好像同一时间内只能够有一个线程进入同一个critical  section 一样。虽然mu tex 和critical section  做相同的事情,但是它们的运作还是有差别的:


i 锁住一个未被拥有的mu tex,比锁住一个未被拥有的critical  section,需要花费几乎100  倍的时间。因为critical section  不需要进入操作系统核心,直接在“user m ode”就可以进行操作。(译注:作者这里所谓的“user mode”,是相对于Window s NT 的“kernel mode”而言。至于Window s 95 底下,没有所谓“user mode”这个名词或观念,应该是指ring3  层次。)
iMutexes可以跨进程使用。Critical section则只能够在同一个进程中使用。i  等待一个mu tex 时,你可以指定“结束等待”的时间长度。但对于critical section 则不行。
HANDLE CreateMutex( 
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName
); 
参数
lpMutexAttributes  安全属性。NULL 表示使用默认的属性。这一指定在Window s 95 中无效。
bInitialOwner  如果你希望“调用CreateMutex() 的这个线程”拥有产生出来的mu tex,就将此值设为TRUE。
lpNamemu tex 的名称(一个字符串)。任何进程或线程都可以根据此名称使用这一mu tex。名称可以是任意字符串,
只要不含反斜线(backslash,\)即可。
返回值
如果成功,则传回一个handle,否则传回NULL。调用GetLastError() 可以获得更进一步的信息。如果指定的mu tex 名称已经存在,GetLastError() 会
传回ERROR_ ALREADY_EXISTS。

打开一个互斥器(Mutex)

如果mu tex 已经被产生了,并有一个名称,那么任何其他的进程和线程便可以根据该名称打开那个mu tex(我这里并不考虑安全属性)。
如果你调用CreateMutex() 并指定一个早已存在的mu tex 名称,Win32 会回给你一个m utex handle,而不会为你产生一个新的mu tex。就像上面所说的,GetLastError() 会传回ERROR_ ALREADY_EXISTS。
你也可以使用OpenMutex() 打开(而非产生)一个原已存在的mu tex。

锁住一个互斥器(Mutex)

一旦没有任何线程拥有mu tex,这个mu tex 便处于激发状态。因此,如果没有任何线程拥有那个mu tex,Wait...() 便会成功。反过来说,当线程拥有mutex时,它便不处于激发状态。如果有某个线程正在等待一个未被激发的mutex,它便将进入“blocking”(阻塞)状态。也就是说,该线程会停止执行,直到mu tex 被其拥有者释放并处于激发状态。

1. 我们有一个mu tex,此时没有任何线程拥有它,也就是说,它处于非激发状态(译注)。
2. 某个线程调用WaitForSingleO bject()(或任何其他的Wait... () 函数),并指定该m utex handle 为参数。
3. Win32 于是将该mu tex 的拥有权给予这个线程,然后将此mu tex 的状态短暂地设为激发状态,于是Wait...() 函数返回。
4. Mutex 立刻又被设定为非激发状态,使任何处于等待状态下的其他线程没有办法获得其拥有权。
5. 获得该mu tex 之线程调用ReleaseMutex(),将mu tex 释放掉。于是循环回到第一场景,周而复始。

处理被舍弃的互斥器(Mutexes)


文字版电子书-----请点击这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值