您的位置:首页 > 编程语言

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

2016-12-07 16:24 211 查看
互斥量(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
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: