如果多个进程对同一个文件进行操作,一定要加锁,否则文件会发生不可以预知的异常,或者结果不可以预测。
1.CreateMutex函数
功能:作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。
HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 BOOL bInitialOwner, // 初始化互斥对象的所有者 LPCTSTR lpName // 指向互斥对象名的指针 );
2.OpenMutex函数
功能:作用是为现有的一个已命名互斥体对象创建一个新句柄。
HANDLE OpenMutex( DWORDdwDesiredAccess, // access BOOLbInheritHandle, // inheritance option LPCTSTRlpName // object name );
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.作者答疑
如有疑问,敬请留言。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219384.html原文链接:https://javaforall.net
