c++ 程序互斥算法(文件锁以及互斥锁)

来源:互联网 发布:centos 6.5配置要求 编辑:程序博客网 时间:2024/06/10 17:15

一、基于APR

bool check_lock_file()
{
      apr_status_t rv;
      apr_file_t *fp;
      char fname[20] = "./processlock.ini";//文件锁文件
      if ((rv = apr_file_open(&fp, fname, APR_WRITE|APR_CREATE, APR_OS_DEFAULT, mp)) != APR_SUCCESS)//打开失败(如果该文件不存在则先创建,打开方式默认,内存池mp)

     {
            return FALSE;
     }
     rv = apr_file_lock(fp, APR_FLOCK_EXCLUSIVE | APR_FLOCK_NONBLOCK);//给文件上锁------------------一个文件不能同时上两把锁
     if (rv != APR_SUCCESS)
     {
            LOG4CXX_INFO(logger1,"Lock file Error! Another process is running!");//日志文件
            return FALSE;
     }
      return TRUE;
}

 

二、基于winapi的

HANDLE hMutex = CreateMutex(NULL, FALSE, LPCTSTR("Mutex_Only_One_Instance_Allowed"));//创建互斥题
 if (NULL == hMutex)//创建失败
 {
      return -1;
 }
 DWORD dw = WaitForSingleObject(hMutex, 0);
 if (WAIT_FAILED == dw)
 {
     CloseHandle(hMutex); // 释放句柄,当指向同一系统对象的所有句柄释放后,该对象将被删除。
     return -1;
 }
 else if (WAIT_TIMEOUT == dw)
 {
     //另外一个实例正在运行
     CloseHandle(hMutex);
     return 1;
 }