1、为Windows内核对象
2、实现进程或线程的互斥/同步
3、实现为Windows的一组API
1、CreateMutex函数
作用:创建互斥对象,并获取互斥对象的void句柄;或者获取互斥对象的void句柄。
a、原型:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName
);
b、接口说明:
lpMutexAttributes:指向SECURITY_ATTRIBUTES结构的指针
bInitialOwner:创建互斥对象的进程\线程A是否占有权
lpName:指向互斥对象名的字符串指针
返回值:指向互斥对象的void*句柄
2、OpenMutex
作用:获取互斥对象的void*句柄。
a、原型:
HANDLE OpenMutex(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);
b、接口说明:
dwDesiredAccess:对互斥对象访问期望权限
bInheritHandle:子进程能够继承句柄
lpName:指向互斥对象名的字符串指针
返回值:指向互斥对象的void*句柄
3、WaitForSingleObject
作用:获取互斥锁
a、原型:
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
b、接口说明:
hHandle:指向互斥对象的void*句柄
dwMilliseconds:超时间隔(以毫秒为单位)
返回值:指示导致函数返回的事件
4、ReleaseMutex
作用:解锁
a、原型:
BOOL ReleaseMutex(
HANDLE hHandle,
);
b、接口说明:
hHandle:指向互斥对象的void*句柄
例如:
WaitForSingleObject(hMutex,INFINITE); hMutex对象如果变为激发状态,这个函数就会返回,继续往下执行。
5、CloseHandle
作用:释放内核对象副本
BOOL CloseHandle(
HANDLE hObject,
);
b、接口说明:
hHandle:指向互斥对象的void*句柄
1、不可跨PC
2、当多个进程对计算机上的同一份文件进行操作时候,需要对文件进行保护,防止多个进程同时对文件进行修改造成错误,因此可采用Windows的互斥锁Mutex来进行加锁。
// CreatMutex.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
using namespace std;
int main()
{
//打开进程锁
HANDLE hmutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, TEXT("MutexTest"));
//创建进程锁
if (hmutex == NULL)
{
cout<<"Create MutexTest!"<<endl;
hmutex = CreateMutex(NULL, false, TEXT("MutexTest"));
}
//获取进程锁
DWORD ts = WaitForSingleObject(hmutex, INFINITE);
if (WAIT_OBJECT_0 == ts)
{
// 进行数据操作,下面是简单举例
for (int i=0; i<10; i++)
{
cout << i <<endl;
Sleep(1000);
}
}
// 操作完成后释放进程锁
ReleaseMutex(hmutex);
if (hmutex != NULL)
{
CloseHandle(hmutex);
}
return 0;
}
如果一个进程A(线程A):HANDLE hMutexA=CreateMutex(NULL,true,“MyAppMutex”);创建了一个互斥体;
同时另一个进程B(线程B)也:HANDLE hMutexB=CreateMutex(NULL,true,“MyAppMutex”);这个时候hMutexB会得到已经存在的互斥体的句柄吗?
答:不会,而是接口成功会返回该互斥锁的句柄。但是可以通过GetLastError返回ERROR_ALREADY_EXISTS(183L)。
如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810