http://blog.sina.com.cn/s/blog_149e9d2ec0102wyr0.html

在编程中我们常使用程序创建一个互斥的内核对象,目的就是为了让这个程序只能运行一次。我们都会有这样一个经历,那就是如果我们的打开一个游戏或者其他应用程序,会发现如果想在打开这个游戏,会出现打不开的情况,那是因为使用的是互斥的方式打开。当然我们在编写程序时也是可以写成进程间共享,就想QQ一样可以同时打开多个应用程序。

1.  我们需要一个关键的函数:CreateMutex().
这个函数的具体信息大家可以自己百度或查找MSDN。此处我仅仅讲解它的使用。
这个函数有三个参数,特别是第三个参数控制时候可以内存共享。如果你写一个名字比如:
HANDLE hNutex = CreateMutex(NULL, FALSE, L"stf"); //表示创建一个名为stf的互斥内核对象,那么这个程序仅仅在同一台计算机上被允许打开一次。如果再次打开就会出现错误。
HANDLE hNutex = CreateMutex(NULL, FALSE, NULL); //表示创建匿名互斥内核对象,那么这个程序就会被允许多次打开。

我们查看一下相关代码:
#include
#include

int _tmain()
{
    HANDLE hNutex = CreateMutex(NULL, FALSE, NULL);//创建一个名字叫NULL的互斥内核对象
    //匿名内核对象,就是没有名字的内核对象,这种内核对象,不能在进程间共享
    //命名内核对象可以在进程间共享
    if (ERROR_ALREADY_EXISTS == GetLastError())
    {
        _tprintf(L"%s\n", L"This is the next instance! and session id is ");
        return 0;
    }

DWORD sessionid = 0;
    ProcessIdToSessionId(GetProcessId(NULL), &sessionid);
    _tprintf(L"%s\n", L"This is the first instance! and session id is ");

_gettchar();
    return 0;
}

HANDLE hNutex = CreateMutex(NULL, FALSE, L"stf"); //创建命名内核对象。
大家可以通过CreateMutex的第三个参数的修改来确定是哪一个值。

2.  创建本地命名对象和全局命名对象
其实这个还是很简单的如果要创建本地内核对象,只需要在命名对象名字前面加一个Local就行了。如果需要创建全局对象,那么只需要在命名对象前面加一个Global就可。分别如下:
HANDLE hNutex = CreateMutex(NULL, FALSE, L"Local\\stf");  //创建本地内核对象
HANDLE hNutex = CreateMutex(NULL, FALSE, L"Global\\stf");  //创建全局内核对象

但是需要注意的是Session不要轻易使用。即HANDLE hNutex = CreateMutex(NULL, FALSE, L"Session\\stf");少用。

CreateMutex创建互斥内核对象相关推荐

  1. CreateMutex创建互斥体可以用于只运行进程的一个实例

    CreateMutex 作用 找出当前系统是否已经存在指定进程的实例.如果没有则创建一个互斥体.CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为 VC声明 HANDLE ...

  2. 线程与内核对象的同步——Windows核心编程学习手札之九

    线程与内核对象的同步 --Windows核心编程学习手札之九 用户方式下的线程同步机制具有速度快的特点,但有其局限性,对于许多应用程序来说,并不合适.例如,互锁函数家族只能在单值上运行,根本无法使线程 ...

  3. Delphi 10.4利用CreateMutex函数创建互斥对象实例防止程序中多次执行该对象

    windows是个多用户多任务的操作系统,支持多个程序同时运行,如果你的程序不想让用户同时运行一个以上, 那应该怎样做呢? 本文将介绍避免用户同时运行多个程序的例子. 需要用到的函数CreateMut ...

  4. Windows核心编程 第九章 线程与内核对象的同步(下)

    9.4 等待定时器内核对象 等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象.它们通常用来在某个时间执行某个操作. 若要创建等待定时器,只需要调用C r e a t e Wa i ...

  5. Windows核心编程 第三章 内核对象

    第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...

  6. 内核对象——Windows核心编程学习手札系列之三

    内核对象 --Windows核心编程学习手札系列之三 内核对象可供系统和应用程序使用来管理各种各样的资源,如进程.线程.文件等,是内核分配的一个内存块,只能又内核访问,该内存块是一种数据结构,它的成员 ...

  7. 用内核对象进行线程同步

    本章讨论的是如何使用内核对象来对线程进行同步,与用户模式下的同步机制相比,内核对象的用途要广泛的多.实际上,内核对象唯一的缺点就是他们的性能.当我们调用本章任何一个新函数时,调用线程必须从用户模式切换 ...

  8. windows内核对象

    内核对象只是操作系统内核分配的一个内存块,并且只能由操作系统内核访问.该内存块是一种数据结构,它的成员负责维护该对象的各种信息.Windows提供一组函数创建和操作内核对象.调用一个创建内核对象的函数 ...

  9. Windows核心编程 第九章 线程与内核对象的同步(上)

    第9章 线程与内核对象的同步 上一章介绍了如何使用允许线程保留在用户方式中的机制来实现线程同步的方法.用户方式同步的优点是它的同步速度非常快.如果强调线程的运行速度,那么首先应该确定用户方式的线程同步 ...

最新文章

  1. 在Ubuntu 14.04 64bit上安装numpy和matplotlib库
  2. ARC与非ARC混编
  3. redis接口的二次封装
  4. 用计算机数字技术制作的电影是,如何面对电影制作中的数字技术
  5. 这个网盘下载60MB/s!PanDownload复活了!
  6. 虚拟研讨会:.NET的未来在哪里?
  7. 第 1 章 多线程基础介绍
  8. java.lang.object 下载_java.lang.Object
  9. 在redis上实现分布式锁
  10. xstream-0 使用入门
  11. Spark入门案例--出租车数据分析
  12. QT 5.12.9 +VS 2019配置并实现与三菱Q系列PLC通讯功能(1)软件的安装
  13. C#用NPOI控件把MySQL数据库中查询符合条件的数据导出到EXCEL
  14. R语言使用geomtextpath包的coord_curvedpolar函数和coord_polar函数可视化时间表盘(time dial plate)
  15. SSD-Tensorflow 目标检测(自定义数据集(VOC2007格式))
  16. hive分隔符_hive默认分隔符
  17. Web前端开发有哪些岗位职责 要掌握什么技能
  18. java发送邮件格式_java使用main函数进行邮件发送怎样设置邮件格式
  19. 网页设计实验四(DIV+CSS 综合运用 )
  20. 应用程序正常初始化(0xc000012d)失败的问题

热门文章

  1. 【STC89C52】数码管静态显示和动态显示
  2. python.exe-找不到序数:无法定位序数191与动态链接库libiomp5md.dll上
  3. PayPal 支付-Checkout 收银台和 Subscription 订阅计划全过程分享
  4. mysql call_mysql CALL语法使用详解
  5. 运维笔记40 Linux系统监控之Cacti(Cacti搭建,自动抓取cacti统计图片脚本)
  6. DA-PEG-DA MW:2000 DA-PEG2000-DA 双丙烯酸酯聚乙二醇
  7. 自然对数底e的来源1
  8. java修改图片rgb_java图片色阶调整和亮度调整代码示例
  9. matlab中1 1sym,请问为什么计算结果是sym 0x1
  10. 教你用Photoshop画点阵图配合Oled屏幕进行开发显示