南上海网站建设,成都 网站建设培训班,栾城住房和城乡建设局网站,阿里云支持wordpressCreateMutex函数 正常情况下#xff0c;一个进程的运行一般是不会影响到其他正在运行的进程的。但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的#xff0c;而且此类程序通常也不允许运行同…CreateMutex函数
正常情况下一个进程的运行一般是不会影响到其他正在运行的进程的。但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的而且此类程序通常也不允许运行同一个程序的多个实例。这就引出了进程互斥的问题。 实现进程互斥的核心思想比较简单进程在启动时首先检查当前系统是否已经存在有此进程的实例如果没有进程将成功创建并设置标识实例已经存在的标记。此后再创建进程时将会通过该标记而知晓其实例已经存在从而保证进程在系统中只能存在一个实例。具体可以采取内存映射文件、有名事件量、有名互斥量以及全局共享变量等多种方法来实现。下面就分别对其中具有代表性的有名互斥量和全局共享变量这两种方法进行介绍 // 创建互斥量 HANDLE m_hMutex CreateMutex(NULL, FALSE, Sample07); // 检查错误代码 if (GetLastError() ERROR_ALREADY_EXISTS) { // 如果已有互斥量存在则释放句柄并复位互斥量 CloseHandle(m_hMutex); m_hMutex NULL; // 程序退出 return FALSE; } 上面这段代码演示了有名互斥量在进程互斥中的用法。代码的核心是CreateMutex对有名互斥量的创建。CreateMutex函数可用来创建一个有名或无名的互斥量对象其函数原型为 HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 BOOL bInitialOwner, // 初始化互斥对象的所有者 LPCTSTR lpName // 指向互斥对象名的指针 ); 如果函数成功执行将返回一个互斥量对象的句柄。如果在CreateMutex执行前已经存在有相同名字的互斥量函数将返回这个已经存在互斥量的句柄并且可以通过GetLastError得到错误代码ERROR_ALREADY_EXIST。可见通过对错误代码ERROR_ALREADY_EXIST的检测可以实现CreateMutex对进程的互斥。 建立互斥体用来同步。如果一个线程获取了互斥体则要获取该互斥体的第二个线程将被挂起直到第一个线程释放该互斥体。 参数 lpMutexAttributes 指向一个SECURITY_ATTRIBUTES结构的指针这个结构决定互斥体句柄是否被子进程继承。 bInitialOwner 布尔类型决定互斥体的创建者是否为拥有者 lpName 指向互斥体名字字符串的指针。互斥体可以有名字。 互斥体的好处是可以在进程间共享 个人心得体会 CreateMutex() 用于有独占要求的程序 (在其进程运行期间不允许其他使用此端口设备的程序运行或不允许同名程序运行)。 如有同名程序运行则通过 GetLastError得到错误代码 ERROR_ALREADY_EXIST。 刚才又执行了下得出的结果程序名samp 一般情况下一进入调试阶段进程管理器中就出现了samp进程执行到CreateMutex时返回进程句柄执行到if(GetLastError() ERROR_ALREADY_EXISTS ) 进行判断时跳过不执行if中的内容所以表示没有互斥。 调试之前先运行debug中的samp.exe再调试一进入调试阶段进程管理器中就出现了两个samp进程执行到CreateMutex时返回进程句柄执行到if(GetLastError() ERROR_ALREADY_EXISTS ) 进行判断时执行if中的内容表示有互斥。