windows核心编程-互斥量的内核对象

互斥量(mutex)内核对象用来确保一个线程独占对一个资源的访问。互斥量对象包含一个使用计数、线程ID

以及一个递归计数。互斥量与关键段的行为完全相同。但是,互斥量是内核对象,而关键段是用户模式下的

同步对象。

HANDLE WINAPI CreateMutex(
  _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
  _In_     BOOL                  bInitialOwner,  //控制互斥量的初始状态,
                                               //若未FALSE那么互斥量对象的线程ID和递归计数为0,触发状态
                                               //若为TRUE,那么线程ID=调用线程ID,递归计数为1
  _In_opt_ LPCTSTR               lpName
);


互斥量的规则:

如果线程ID为0,那么该互斥量不为任何线程所占用,它处于触发状态。

如果线程ID非零,那么有一个线程已经占用了该互斥量,它处于未触发状态。


为了获得对保护资源的访问权,线程需要调用一个等待函数并传入互斥量的句柄,再内部等待函数会检查线程ID是否为0:

=0:函数把线程ID设置为调用线程的线程ID,把递归计数设为1,然后让线程继续运行

!=0:(互斥量处于未触发状态),把线程ID设置为调用线程的线程ID,把递归计数设为1,让正在等待的线程变成可调度状态



使递归计数大于1的唯一例外是,让多个线程等待同一个互斥量,一旦成功的等到了互斥量,线程就知道自己已经独占

了对受保护对象资源的访问,任何试图获得资源的访问权的线程都将进入等待状态,当目前占有资源的线程不需要访问资源的时候

需要调用

BOOL ReleaseMutex(HANDLE hMutex) 让递归计数减一,(多次)


dwDesiredAccess参数中指定访问权限。参数dwFlags代替了CreateMutex中的参数bInitialOwned:
0代表FALSE,CREATE_MUTEX_INITIAL_OWNER等价于TRUE

HANDLE WINAPI CreateMutexEx(
  _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
  _In_opt_ LPCTSTR               lpName,
  _In_     DWORD                 dwFlags,
  _In_     DWORD                 dwDesiredAccess
);


可以使用OpenMutex来得到一个已经存在的互斥量的句柄,该句柄与当前进程相关联

HANDLE WINAPI OpenMutex(
  _In_ DWORD   dwDesiredAccess,
  _In_ BOOL    bInheritHandle,
  _In_ LPCTSTR lpName
);

HANDLE WINAPI CreateMutexEx(
  _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
  _In_opt_ LPCTSTR               lpName,
  _In_     DWORD                 dwFlags,
  _In_     DWORD                 dwDesiredAccess
);





HANDLE WINAPI CreateMutexEx(
  _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
  _In_opt_ LPCTSTR               lpName,
  _In_     DWORD                 dwFlags,
  _In_     DWORD                 dwDesiredAccess
);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值