windows核心编程-互斥量的内核对象
2016-12-07 16:24
211 查看
互斥量(mutex)内核对象用来确保一个线程独占对一个资源的访问。互斥量对象包含一个使用计数、线程ID
以及一个递归计数。互斥量与关键段的行为完全相同。但是,互斥量是内核对象,而关键段是用户模式下的
同步对象。
互斥量的规则:
如果线程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
可以使用OpenMutex来得到一个已经存在的互斥量的句柄,该句柄与当前进程相关联
以及一个递归计数。互斥量与关键段的行为完全相同。但是,互斥量是内核对象,而关键段是用户模式下的
同步对象。
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 );
相关文章推荐
- 读书笔记----《windows核心编程》第三章 内核对象1(句柄与安全性)
- Windows核心编程之3 内核对象
- Windows核心编程--事件内核对象
- 《Windows核心编程》笔记1 --内核对象
- windows核心编程-用内核对象进行线程同步
- Windows核心编程 第3章 内核对象
- 《Windows核心编程》——三 内核对象
- WINDOWS核心编程--读书笔记:第三章 内核对象
- 《Windows核心编程》---内核对象和进程基础
- 摘自windows核心编程之用内核对象进行线程同步
- 【windows核心编程】 第三章 内核对象
- Windows核心编程:内核对象
- windows核心编程第三章阅读 内核对象
- Windows核心编程笔记---内核对象
- (摘自windows核心编程之用内核对象进行线程同步)
- windows核心编程-可等待的计时器内核对象
- 《Windows核心编程》之“内核对象”
- windows核心编程--内核对象和句柄泄漏
- (摘自windows核心编程之用内核对象进行线程同步)