CreateMutex的使用

CreateMutex的使用CreateMutex 作用是找出当前系统是否已经存在指定进程的实例 如果没有则创建一个互斥体 HANDLECreate LPSECURITY ATTRIBUTESlp 指向安全属性的指针 BOOLbInitial 初始化互斥对象的所有者 LPCTSTRlpNam 指向互斥对象名的指针 创建一个

CreateMutex作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。

HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针
BOOLbInitialOwner, // 初始化互斥对象的所有者
LPCTSTRlpName // 指向互斥对象名的指针
);

创建一个互斥体(MUTEX)
返回值
Long,如执行成功,就返回互斥体对象的句柄;零表示出错。会设置GetLastError。如果返回的是一个有效句柄,但指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS,bInitialOwner的值将会被忽略。如果调用者限制了权限,GetLastError将会返回ERROR_ACCESS_DENIED,这个时候应该使用OpenMutex函数。
参数表
参数 类型及说明
lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符
bInitialOwner BOOL,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有
lpName String,指定互斥体对象的名字。用vbNullString创建一个未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符

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


  #include


  …… // main function
  HANDLE m_hMutex = CreateMutex(NULL, FALSE, “Sample07”);// 检查错误代码
if (GetLastError() == ERROR_ALREADY_EXISTS)
  {
  // 如果已有互斥量存在则释放句柄并复位互斥量 
  CloseHandle(m_hMutex);
  m_hMutex = NULL;
  // 程序退出
  return FALSE;
  };
//上面这段代码演示了有名互斥量在进程互斥中的用法。代码的核心是CreateMutex()对有名互斥量的创建。
CreateMutex() 用于有独占要求的程序 (在其进程运行期间不允许其他使用此端口设备的程序运行,或不允许同名程序运行)。
详细例子
下面这段代码详细介绍了CreateMutex函数的使用方法:[1] 
#include “stdafx.h”
#include “windows.h”
 
int main(int argc, char* argv[])
{
    HANDLE m_hMutex = CreateMutex(NULL,TRUE,”cplusplus_me”);
    DWORD dwRet = GetLastError();
    if (m_hMutex)
    {
        if (ERROR_ALREADY_EXISTS == dwRet)
        {
            printf(“程序已经在运行中了,程序退出!\n”);
            CloseHandle(m_hMutex);
            return 0;
        }
    }
    else
    {
        printf(“创建互斥量错误,程序退出!\n”);
        CloseHandle(m_hMutex);
        return 0;
    }
    while(1)
    {
        printf(“cplusplus_me\n”);
    }
    CloseHandle(m_hMutex);
    return 0;
}







































































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223274.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:27
下一篇 2026年3月17日 下午2:27


相关推荐

  • JavaScript 精粹:Number 与 Math

    JavaScript 精粹:Number 与 Math

    2021年7月1日
    121
  • VGG网络模型详解

    VGG网络模型详解如今深度学习发展火热 但很多优秀的文章都是基于经典文章 经典文章中的一句一词都值得推敲和分析 此外 深度学习虽然一直被人诟病缺乏足够令人信服的理论 但不代表我们不能感性分析理解 下面我们将对 2014 年夺得 ImageNet 的定位第一和分类第二的 VGG 网络进行分析 在此过程中更多的是对这篇经典文章的感性分析 希望和大家共同交流产生共鸣 如果有理解不到位的也真诚期待指出错误 Simonyan Ka

    2026年3月20日
    31
  • 安装 | MATLAB2018a (64位) 安装教程及安装包下载链接「建议收藏」

    安装 | MATLAB2018a (64位) 安装教程及安装包下载链接「建议收藏」博主github:https://github.com/MichaelBeechan博主CSDN:https://blog.csdn.net/u011344545安装包下载链接:内附MATLAB从入门到精通视频教程全17讲链接:https://pan.baidu.com/s/12NM-hWPhXg8mFhdoGbpv7A提取码:1i4x链接:https://pan.baidu…

    2022年6月12日
    40
  • 解决:java.lang.AbstractMethodError: null

    解决:java.lang.AbstractMethodError: nullspringboot2.x整合sqlserver使用jtds连接池连数据库的时候出现异常2017-02-1512:12:23.955WARN14844—[main]ationConfigEmbeddedWebApplicationContext:Exceptionencounteredduringcontextinitializ…

    2022年6月2日
    375
  • Mybatis RowBounds 分页原理「建议收藏」

    Mybatis RowBounds 分页原理「建议收藏」在mybatis中,使用RowBounds进行分页,非常方便,不需要在sql语句中写limit,即可完成分页功能。但是由于它是在sql查询出所有结果的基础上截取数据的,所以在数据量大的sql中并不适用,它更适合在返回数据结果较少的查询中使用最核心的是在mapper接口层,传参时传入RowBounds(intoffset,intlimit)对象,即可完成分页注意:由于java允许的最大整数为2147483647,所以limit能使用的最大整数也是214748…

    2025年12月9日
    6
  • 双系统 Win10下安装Linux(单/双硬盘)

    双系统 Win10下安装Linux(单/双硬盘)双系统Win10下安装Linux(单/双硬盘)

    2022年7月24日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号