文章目录
如果多个进程对同一个文件进行操作,一定要加锁,否则文件会发生不可以预知的异常,或者结果不可以预测。
1.CreateMutex函数
- 1.CreateMutex函数
- 2.OpenMutex函数
- 3.WaitForSingleObject函数
- 4.ReleaseMutex函数
- 5.作者答疑
功能:作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针
BOOL bInitialOwner, // 初始化互斥对象的所有者
LPCTSTR lpName // 指向互斥对象名的指针
);
2.OpenMutex函数
功能:作用是为现有的一个已命名互斥体对象创建一个新句柄。
HANDLE OpenMutex(
DWORDdwDesiredAccess, // access
BOOLbInheritHandle, // inheritance option
LPCTSTRlpName // object name
);
参数说明: 第一个参数表示访问权限,对互斥量一般传入MUTEX_ALL_ACCESS。详细解释可以查看MSDN文档。 第二个参数表示互斥量句柄继承性,一般传入TRUE即可。 第三个参数表示名称。某一个进程中的线程创建互斥量后,其它进程中的线程就可以通过这个函数来找到这个互斥量。 函数访问值:成功返回一个表示互斥量的句柄,失败返回NULL。
3.WaitForSingleObject函数功能:WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
4.ReleaseMutex函数
功能:它是一种线性指令,释放线程拥有的互斥体的控制权。
BOOL WINAPI ReleaseMutex(
_In_ HANDLE hMutex
);
参数说明:访问互斥资源前应该要调用等待函数,结束访问时就要调用ReleaseMutex()来表示自己已经结束访问,其它线程可以开始访问了。
一般互斥使用形式如下:
bool ACopyFileExt(std::string src_filename, std::string dst_filename)
{
HANDLE mutex;
mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "ACopyFileExt");
if (mutex == NULL)
{
mutex = CreateMutex(NULL, FALSE, "ACopyFileExt");
}
WaitForSingleObject(mutex, INFINITE);
//功能区
bool rlt = ACopyFile(src_filename, dst_filename);
ReleaseMutex(mutex);
return rlt;
}
5.作者答疑
如有疑问,敬请留言。