说明:当多个进程对计算机上的同一份文件进行操作时候,需要对文件进行保护,防止多个进程同时对文件进行修改造成错误,因此可采用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;
}