zoukankan      html  css  js  c++  java
  • CreateMutex

    C++
    API CreateMutex

    找出当前系统是否已经存在指定进程的实例。假设没有则创建一个相互排斥体。CreateMutex()函数可用来创建一个有名或无名的相互排斥量对象。

    HANDLE CreateMutex(   
    LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针   
    BOOL bInitialOwner, // 初始化相互排斥对象的全部者   
    LPCTSTR lpName // 指向相互排斥对象名的指针   );

    返回值   
    Long,如运行成功,就返回相互排斥体对象的句柄;零表示出错。会设置GetLastError。
    即使返回的是一个有效句柄,但倘若指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS

    參数表   參数 类型及说明   
    lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将參数声明为ByVal As Long,并传递零值),
    表示使用不同意继承的默认描写叙述符。

    bInitialOwner BOOL,如创建进程希望马上拥有相互排斥体,则设为TRUE。一个相互排斥体同一时候仅仅能由一个线程拥有。是FALSE,表示刚刚创建的这个Mutex不属于不论什么线程
    也就是没有不论什么线程拥有他,一个Mutex在没有不论什么线程拥有他的时候,他是处于激发态的, 所以处于有信号状态。

    lpName String,指定相互排斥体对象的名字。用vbNullString创建一个未命名的相互排斥体对象。如已经存在拥有这个名字的一个事件,
    则打开现有的已命名相互排斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符
    该名称能够有一个"Global" 或"Local" 前缀,明白地建立在全局或会话命名空间的对象。剩余的名称能够包括不论什么字符,除反斜杠字符()。
    使用终端服务(Terminal Services)会话,实现用户切换。内核对象名称必须遵循的指导方针,使应用程序能够支持多个用户终端服务。
    typedef BOOL (CALLBACK* VERIFY_VERSION_INFO)
     (
     LPOSVERSIONINFOEX lpVersionInformation, 
     DWORD dwTypeMask, 
     DWORDLONG dwlConditionMask
     );

    typedef ULONGLONG (CALLBACK* VER_SETCONDITION_MASK)(
     ULONGLONG dwlConditionMask,
     DWORD dwTypeBitMask,
     BYTE dwConditionMask
     );
    bool IsValidTerminalService()
    {
     bool result = FALSE;
     HINSTANCE hInst = LoadLibrary("Kernel32.Dll");
     if (hInst != NULL)
     {
      VERIFY_VERSION_INFO procVerifyVersionInfo = reinterpret_cast<VERIFY_VERSION_INFO>(::GetProcAddress(hInst, "VerifyVersionInfoA"));
      VER_SETCONDITION_MASK procVerSetConditionMask = reinterpret_cast<VER_SETCONDITION_MASK>(::GetProcAddress(hInst, "VerSetConditionMask"));

      if (procVerifyVersionInfo != NULL && procVerSetConditionMask != NULL)
      {
       OSVERSIONINFOEX osVersionInfo;
       DWORDLONG dwlConditionMask = 0;

       //(&osVersionInfo, sizeof(OSVERSIONINFOEX));
       osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
       osVersionInfo.wSuiteMask = VER_SUITE_TERMINAL; // Terminal Services

       dwlConditionMask = procVerSetConditionMask(dwlConditionMask, VER_SUITENAME, VER_AND);
       result = procVerifyVersionInfo(&osVersionInfo,VER_SUITENAME,dwlConditionMask);

      }
      ::FreeLibrary(hInst);
     }

     return result;
    }

    注意:
    一旦不再须要,注意必须用CloseHandle函数将相互排斥体句柄关闭。从属于它的全部句柄都被关闭后,
    就会删除对象   进程中止前,一定要释放相互排斥体,如不慎未採取这个措施,就会将这个相互排斥体标记为废弃,并自己主动释放全部权。
    共享这个相互排斥体的其它应用程序或许仍然可以用它,但会接收到一个废弃状态信息,指出上一个全部进程未能正常关闭。这样的状况是否会造成影响取决于涉及到的详细应用程序

    使用样例:
    (1)、 h_mutex1=CreateMutex(NULL,FALSE,"mutex_for_readcount");//创建一个相互排斥体   
    (2)、HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");// 检查错误代码   
    if (GetLastError() == ERROR_ALREADY_EXISTS)   
    {   
    // 假设已有相互排斥量存在则释放句柄并复位相互排斥量   
    CloseHandle(m_hMutex);   
    m_hMutex = NULL;   // 程序退出   
    return FALSE;   
    };   //上面这段代码演示了有名相互排斥量在进程相互排斥中的使用方法。代码的核心是CreateMutex()对有名相互排斥量的创建。   
    CreateMutex() 用于有独占要求的程序 (在其进程执行期间不同意其它使用此port设备的程序执行,或不同意同名程序执行)。

  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4063305.html
Copyright © 2011-2022 走看看