CreateMutex互斥量

CreateMutex互斥量C++API CreateMutex找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。CreateMutex()函数可用来创建一个有名或无名的互斥量对象。HANDLECreateMutex(  LPSECURITY_ATTRIBUTES lpMutexAttributes,//指向安全属性的指针  BOOL bInitialOwner,//

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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)会话,实现用户切换。内核对象名称必须遵循的指导方针,使应用程序可以支持多个用户终端服务。

注意:
一旦不再需要,注意必须用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() 用于有独占要求的程序 (在其进程运行期间不允许其他使用此端口设备的程序运行,或不允许同名程序运行)。

#include <windows.h>
#include <iostream.h>

DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);

int index=0;
int tickets=100;
HANDLE hMutex;
void main()
{
    HANDLE hThread1,hThread2;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    
    hMutex=CreateMutex(NULL,FALSE,NULL);
    //TRUE代表主线程拥有互斥对象 但是主线程没有释放该对象  互斥对象谁拥有 谁释放
    //FLASE代表当前没有线程拥有这个互斥对象

    Sleep(4000);

}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
    while (true)
    {
        WaitForSingleObject(hMutex,INFINITE);
        if (tickets>0)
        {
            cout<<"t1: "<<tickets--<<endl;
        
        }
        else
        {
            break;
        }
        ReleaseMutex(hMutex);
    }

    return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
    while (true)
    {
        WaitForSingleObject(hMutex,INFINITE);
        if (tickets>0)
        {
            cout<<"t2: "<<tickets--<<endl;
        }
        else
        {
            break;
        }
        ReleaseMutex(hMutex);
    }

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 腾讯云ssl证书_腾讯云认证证书

    腾讯云ssl证书_腾讯云认证证书如今在网站使用https已经是非常普遍的事情,对于站长来说,https证书似乎已经成为了必备,今天我们为大家介绍申请腾讯云https证书的方法与过程首先打开腾讯云的管理控制台,进入证书管理页面,我们可以看到这里有一个叫做申请证书的按钮,点击它腾讯云会让你选择证书的类型,因为我们要申请免费的,选择左边的亚洲诚信免费版DVSSL证书即可,右边的为收费证书填入自己的域名以及申请邮箱,注意域名的格式为你需…

    2022年9月9日
    0
  • excel批量导入图片 宏_怎么启用excel的宏

    excel批量导入图片 宏_怎么启用excel的宏准备图片格式规范:C盘的picture文件夹,放100张有序命名的图片,即1.jpg,2.jpg,3.jpg…100.jpg插入图片规则:按照图片的顺序,依次插入表格的A列,让每个图片一个单元

    2022年8月6日
    13
  • 图像降噪算法——从BM3D到VBM4D

    图像降噪算法——从BM3D到VBM4D图像降噪算法——BM3D图像降噪算法——BM3D1.基本原理2.C++代码实现3.结论图像降噪算法——BM3DBM3D是目前非AI降噪算法中最优的算法之一,其降噪效果确实非常惊艳,网上的资料也相对较多,我觉得写得最好的一篇博客是通俗语言说BM3D,这个博主应该是个搞图像处理的大佬,对原理理解得比较深,这里我对BM3D进行一个简单总结,然后扒了一个C++实现对接口进行了修改,移植到我自己的工程里(因为实在是忙得没时间自己复现一遍)1.基本原理2.C++代码实现3.结论…

    2022年6月5日
    63
  • com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure一、前言在学习AndroidAndroid入门案例(二)——JDBC连接MySql数据库使用jdbc方式连接本地数据库时报错:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:CommunicationslinkfailureThelastpacketsentsuccessfullytotheserve……

    2022年6月23日
    30
  • pycharm-2021.3.3激活码破解方法

    pycharm-2021.3.3激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    1.3K
  • python的变量名命名规则_python的变量命名规范

    python的变量名命名规则_python的变量命名规范一.python变量名命名规则:1.变量名通常由字母,数字,下划线组成;2.数字不能作为变量名开头;3.不能以python中的关键字命名;4.变量名要有意义;5.不要用汉字和拼音去命名;6.变量名要区分大小写;7.推荐使用驼峰型(GuessAge或guessAge)和下划线(guess_age)来命名;8.常量通常使用大写来定义.二.注释代码的方法1.单行(当行)注释:用#2.多行注释通过三引号完…

    2022年5月1日
    179

发表回复

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

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