c++ 进程锁:在进程间使用Windows的互斥锁Mutex

说明:当多个进程对计算机上的同一份文件进行操作时候,需要对文件进行保护,防止多个进程同时对文件进行修改造成错误,因此可采用Windows的互斥锁Mutex来进行加锁。CreateMutex时可以指定一个mutex名称,此名称可以被其他进程或线程使用。CreateMutex的第二个参数BOOL bInitialOwner表示在创建后是不是立刻获取此锁,相当于立即WaitForSingleObject。

一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象。线程中止前,一定要调用ReleaseMutex释放互斥体,如不慎未采取这个措施,就会将这个互斥体标记为废弃(下一个释放的等待函数会返回WAIT_ABANDONED),并自动释放所有权。共享这个互斥体的其他应用程序也许仍然能够用它,但会接收到一个废弃状态信息,指出上一个所有进程未能正常关闭。这种状况是否会造成影响取决于涉及到的具体应用程序。 在Windows系统中,线程可以在等待函数中指定一个此线程已经拥有的互斥体,由于Windows的防死锁机制,这种做法不会阻止此线程的运行。

在这里插入图片描述

// CreatMutex.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <stdio.h>
#include <windows.h>
#include <iostream>
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;
}

猜你喜欢

转载自blog.csdn.net/m0_37251750/article/details/121243612