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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java db 使用_JavaDB的基本使用[通俗易懂]

    java db 使用_JavaDB的基本使用[通俗易懂]Derby並不是一個新的數據庫產品,它是由IBM捐獻給Apache的DB項目的一個純Java數據庫,JDK6.0里面帶的這個Derby的版本是10.2.1.7,支持存儲過程和觸發器;有兩種運行模式,一種是作為嵌入式數據庫,另一種是作為網絡數據庫,前者的數據庫服務器和客戶端都在同一個JVM里面運行,后者允許數據庫服務器端和客戶端不在同一個JVM里面,而且允許這兩者在不同的物理機器上.值得注意的是JD…

    2022年7月7日
    38
  • Java日志管理

    Java日志管理

    2021年6月8日
    102
  • MapReduce InputFormat之FileInputFormat

    一:简单认识InputFormat类InputFormat主要用于描述输入数据的格式,提供了以下两个功能:1)、数据切分,按照某个策略将输入数据且分成若干个split,以便确定MapTask的个数即Mapper的个数,在MapReduce框架中,一个split就意味着需要一个MapTask;2)为Mapper提供输入数据,即给定一个spli…

    2022年4月6日
    37
  • WebStorm 格式化代码快捷键

    WebStorm 格式化代码快捷键原文链接:https://kaifazhinan.com/webstorm-formatting-code-shortcuts/现在平时都是使用VSCode作为日常开发工具,偶尔会打开WebStorm临时使用一下,但是却经常忘记格式化代码的快捷键,放在这里防止遗忘。WindowsWindows系统下WebStorm格式化代码的快键键为:Ctrl+Alt+l…

    2022年4月27日
    86
  • eclipse安装教程(win10)

    eclipse安装教程(win10)1.官网下载下载链接:http://www.eclipse.org/downloads/2.运行运行后有很多版本可供选择EclipseIDEforJavaDevelopers是为java开发的EclipseIDEforJavaEEDevelopers是为J2EE开发的EclipseforRCP/Plug-inDevelopers是…

    2022年6月8日
    37
  • 我为什么会贫穷

    我为什么会贫穷

    2021年8月29日
    55

发表回复

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

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