c++多线程重点难点(三)Mutex

c++多线程重点难点(三)Mutex互斥量互斥量是一个内核对象,它用来确保一个线程独占一个资源的访问。互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源。使用互斥量Mutex主要将用到四个函数创建互斥量:CreateMutex函数返回一个互斥量的句柄或者NULL打开互斥量:OpenMutex函数返回一个互斥量的句柄或者NULL触发互斥量:ReleaseMutex访问互斥资源前应该要调用等待函数,结

大家好,又见面了,我是你们的朋友全栈君。

互斥量

互斥量是一个内核对象,它用来确保一个线程独占一个资源的访问。互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源。使用互斥量Mutex主要将用到四个函数

创建互斥量:CreateMutex
函数返回一个互斥量的句柄或者NULL

打开互斥量:OpenMutex
函数返回一个互斥量的句柄或者NULL

触发互斥量:ReleaseMutex
访问互斥资源前应该要调用等待函数,结束访问时就要调用ReleaseMutex()来表示自己已经结束访问,其它线程可以开始访问了。

销毁互斥量:CloseHandle
内核对象的销毁都可以用这个方法

要注意的是:

1.互斥量解决不了线程间的同步问题
2.互斥量和关键段一样拥有“线程拥有权”
3.遗弃特性:
比如有一个占用互斥量的线程在调用ReleaseMutex()触发互斥量前就意外终止了(相当于该互斥量被“遗弃”了),那么所有等待这个互斥量的线程是否会由于该互斥量无法被触发而一直阻塞?这显然不合理。因为占用某个互斥量的线程既然终止了那足以证明它不再使用被该互斥量保护的资源,所以这些资源完全并且应当被其它线程来使用。因此在这种“遗弃”情况下,系统自动把该互斥量内部的线程ID设置为0,并将它的递归计数器复置为0,表示这个互斥量被触发了。然后系统将“公平地”选定一个等待线程来完成调度(被选中的线程的WaitForSingleObject()会返回WAIT_ABANDONED_0)。

下面有两个程序用来实现mutex的遗弃特性,运用这两个程序时要先启动程序一再启动程序二,将程序一中//exit(0);前面的注释符号去掉,这样程序一在触发互斥量之前就会因为执行exit(0);语句而且退出,程序二会收到WAIT_ABANDONED消息并输出“拥有互斥量的进程意外终止”:

//程序一
#include <stdio.h>
#include <conio.h>
#include <windows.h>
const char MUTEX_NAME[] = "Mutex_MoreWindows";
int main()
{
    HANDLE hMutex = CreateMutex(NULL, TRUE, MUTEX_NAME); //创建互斥量
    printf("互斥量已经创建,现在按任意键触发互斥量\n");
    getch();
    //exit(0);
    ReleaseMutex(hMutex);
    printf("互斥量已经触发\n");
    CloseHandle(hMutex);
    return 0;
}
//程序二
#include <stdio.h>
#include <windows.h>
const char MUTEX_NAME[] = "Mutex_MoreWindows";
int main()
{
    HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, TRUE, MUTEX_NAME); //打开互斥量
    if (hMutex == NULL)
    {
        printf("打开互斥量失败\n");
        return 0;
    }
    printf("等待中....\n");
    DWORD dwResult = WaitForSingleObject(hMutex, 20 * 1000); //等待互斥量被触发
    switch (dwResult)
    {
    case WAIT_ABANDONED:
        printf("拥有互斥量的进程意外终止\n");
        break;

    case WAIT_OBJECT_0:
        printf("已经收到信号\n");
        break;

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

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

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


相关推荐

  • 百度地图总结

    百度地图总结

    2021年6月10日
    144
  • JAVA缓存机制_JAVA锁机制

    JAVA缓存机制_JAVA锁机制缓存可分为二大类:一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式; 二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查.下面为一个简单的缓存代码Java代码package lhm.hcy.guge.frameset.cache;    import j

    2022年10月4日
    2
  • 模糊隶属函数确定例题_高斯隶属度函数

    模糊隶属函数确定例题_高斯隶属度函数1、模糊隶属度函数的确定方法直觉法:人们用自己对模糊概念的认识和理解,或者人们对模糊概念的普遍认同来建立隶属函数。这种方法通常用于描述人们熟知、有共识的客观模糊现象,或者用于难于采集数据的情形。二元对比排序法:二元对比排序方法就是通过对多个对象进行两两对比来确定某种特征下的顺序,由此来决定这些对象对该特征的隶属程度。这种方法更适用于根据事物的抽象性质由专家来确定隶属函数的情形,可以通过多名专家或者一个委员会,甚至–次民意测验来实施。模糊统计实验法:类似于统计学中的大样本实验法,根据概

    2025年6月30日
    2
  • pushd popd命令「建议收藏」

    pushd popd命令「建议收藏」在本系列的第一部分中,我们通过讨论 cd- 命令的用法,重点介绍了Linux中的命令行导航。还讨论了一些其他相关要点/概念。现在进一步讨论,在本文中,我们将讨论如何使用 pushd 和 popd 命令在Linux命令行上获得更快的导航体验。在我们开始之前,值得说明的一点是,此后提到的所有指导和命令已经在Ubuntu14.04和Bashshell(4.3.11)上

    2022年6月28日
    37
  • html视频标签属性_html音频标签

    html视频标签属性_html音频标签一、基本语法 代码如下: embedsrc=url 说明:embed可以用来插入各种多媒体,格式可以是Midi、Wav、AIFF、AU、MP3等等,Netscape及

    2022年8月3日
    5
  • 2021年调味品行业发展的现状_2020年调味品行业所处阶段

    2021年调味品行业发展的现状_2020年调味品行业所处阶段2021年,受到需求收缩、成本上涨、预期转弱等因素叠加的影响,调味品行业发展面临巨大挑战,多数调味品上市公司发展趋缓。一、调味品上市公司经营现状2021年,16家调味品上市公司营业收入合计为871亿元,营业收入正增长的有12家,占16家上市公司的75%,其中营业收入排名前三位的公司分别是海天味业、梅花生物和安琪酵母,营业收入分别是250亿元、228.4亿元、106.8亿元,分别同比增长9.7%、33.9%、19.5%。2021年中国调味品上市公司营业收入及同比增长资料来源:中国调

    2025年6月15日
    5

发表回复

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

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