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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 卡方检验spss步骤_数据分析–学统计&amp;SPSS操作

    卡方检验spss步骤_数据分析–学统计&amp;SPSS操作笔记内容来源:拉勾教育数据分析实战训练营我是一个在教育留学行业8年的老兵,受疫情的影响留学行业受挫严重,让我也不得不积极寻找新的职业出路。虽然我本身是留学行业,但对数据分析一直有浓厚的兴趣,日常工作中也会做一些数据的复盘分析项目。加上我在留学行业对于各专业的通透了解,自2016年起,在各国新兴的专业–商业分析、数据科学都是基于大数据分析的专业,受到留学生的火爆欢迎,可见各行各业对于数据分析的人才…

  • acwing1185. 单词游戏(欧拉图)「建议收藏」

    acwing1185. 单词游戏(欧拉图)「建议收藏」有 N 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词。你需要给这些盘子安排一个合适的顺序,使得相邻两个盘子中,前一个盘子上单词的末字母等于后一个盘子上单词的首字母。请你编写一个程序,判断是否能达到这一要求。输入格式第一行包含整数 T,表示共有 T 组测试数据。每组数据第一行包含整数 N,表示盘子数量。接下来 N 行,每行包含一个小写字母字符串,表示一个盘子上的单词。一个单词可能出现多次。输出格式如果存在合法解,则输出”Ordering is possible.”,否则输出”The

  • 纯滚动怎么理解_scrollview不滚动

    纯滚动怎么理解_scrollview不滚动[1]滚动宽高[2]页面尺寸[3]滚动长度[4]页面滚动[5]滚动方法[6]滚动事件

  • 电子科技大学考研真题在哪找_二本电子科技大学排名

    电子科技大学考研真题在哪找_二本电子科技大学排名全局目录说明:电子科技大学计算机专业基础专业的科目代码2003年是429,2005年不详,2006年改为413,2008年改为820。电子科技大学信息与软件工程学院、计算机科学与工程学院、电子科学技术研究院、自动化工程学院均考此科目。2014年电子科技大学820计算机专业基础考研真题电子科技大学20U年攻读硕士学位硏究生入学考试试题考试科目:820计算机专业基础注:所有答秦必须写…

  • java构造函数调用构造函数[通俗易懂]

    java构造函数调用构造函数[通俗易懂]一个类可包含多个构造函数,在java中一个构造函数可以

  • 二进制补码的理解_25的八位原码反码补码

    二进制补码的理解_25的八位原码反码补码正数的原码=反码=补码。负数的原码、反码、补码关系为:     原码= 正数的原码符号位变为1,    反码= 正数的原码取反    补码= 正数的原码取反加1。 补码主要为了计算机进行减法运算。参考1:https://www.cnblogs.com/guanjianzhuo/p/6017291.html参考2:https://www.jia…

    2022年10月21日

发表回复

您的电子邮箱地址不会被公开。

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