C#(五十四)之线程Mutex互斥

news2024/11/27 18:48:24

Mutex(互斥体):

排他性的使用共享资源称为线程间的互斥。

使用Mutex类要比使用monitor类消耗更多的系统资源,但他可以跨越多个应用程序,在多个应用程序间同步。

构造函数

Mutex()

使用默认属性初始化 Mutex 类的新实例。

Mutex(Boolean)

用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值

来初始化 Mutex 类的新实例。

Mutex(Boolean,   String)

用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值和一个作为互斥体名称

的字符串来初始化 Mutex 类的新实例。

Mutex(Boolean,   String, Boolean)

使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称

的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权

的 Boolean 值初始化 Mutex 类的新实例。

Mutex(Boolean,   String, Boolean, MutexSecurity)

使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称

的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权

以及访问控制安全是否已应用到命名互斥体的 Boolean

变量初始化 Mutex 类的新实例。

方法

Close()

释放由当前 WaitHandle 占用的所有资源。

CreateObjRef(Type)

创建一个对象,该对象包含生成用于与远程对象进行通信的代理

所需的全部相关信息。

Dispose()

释放 WaitHandle 类的当前实例所使用的所有资源。

Dispose(Boolean)

当在派生类中重写时,释放 WaitHandle 使用的非托管资源,

并且可选择释放托管资源。

Equals(Object)

确定指定的对象是否等于当前对象。

GetAccessControl()

获取一个 MutexSecurity 对象,该对象表示已命名互斥体的访问控制安全性。

GetHashCode()

作为默认哈希函数。

GetLifetimeService()

检索控制此实例的生存期策略的当前生存期服务对象。

GetType()

获取当前实例的 Type。

InitializeLifetimeService()

获取生存期服务对象来控制此实例的生存期策略。

MemberwiseClone()

创建当前 Object 的浅表副本。

MemberwiseClone(Boolean)

创建当前 MarshalByRefObject 对象的浅表副本。  

OpenExisting(String)

打开指定名称为   mutex(如果已经存在)。

OpenExisting(String,   MutexRights)

用安全访问权限打开指定名称为 mutex(如果已经存在),

并返回指示操作是否成功的值。

ReleaseMutex()

释放 Mutex 一次。

SetAccessControl(MutexSecurity)

设置已命名的系统互斥体的访问控制安全性。

ToString()

返回表示当前对象的字符串。

TryOpenExisting(String,   Mutex)

打开指定的已命名的互斥体(如果已经存在),并返回指示操作是否成功的值。

TryOpenExisting(String,   MutexRights, Mutex)

利用所需的安全访问权限,打开指定的已命名的互斥体(如果已经存在),并返回指示操作是否成功的值。

WaitOne()

阻止当前线程,直到当前 WaitHandle 收到信号。

WaitOne(Int32)

阻止当前线程,直到当前 WaitHandle 收到信号

WaitOne(Int32,   Boolean)

阻止当前线程,直到当前的 WaitHandle 收到信号为止

WaitOne(TimeSpan)

阻止当前线程,直到当前实例收到信号,

同时使用 TimeSpan 指定时间间隔。

WaitOne(TimeSpan,   Boolean)

阻止当前线程,直到当前实例收到信号为止,

同时使用 TimeSpan 指定时间间隔

属性

Handle

获取或设置本机操作系统句柄。

SafeWaitHandle

获取或设置本机操作系统句柄。

局部互斥:

使用方法与Monitor类似

系统互斥:

在声明mutex对象时,在构造函数中传入该线程的名字,两个应用线程的名字相同,我们就认为该mutex线程时系统互斥线程

// 参数(bool, 互斥体名称只有两个应用中互斥体名称相同时才是系统互斥)
Mutex mutexbb = new Mutex(false, "MutexForTimeRecordFile");

程序A:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;
namespace mutexaaa
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(delegate() {
                // 参数(bool,互斥体名称,只有两个应用中互斥体名称相同时,才是系统互斥)
                Mutex mutex = new Mutex(false,"MutexForTimeRecordFile");
                string content = @"F:codeFilesfile.txt";
                try
                {
                    for (int i = 0; i < 10; i++)
                    {
                        mutex.WaitOne();
                        File.AppendAllText(content, "metuxaaa" + DateTime.Now + "

");
                        Console.WriteLine("线程开启");
                    }
                   
                }
                catch (Exception qq)
                {
                    Console.WriteLine(qq.Message);
                }
                finally
                {
                    mutex.ReleaseMutex();
                }
                Thread.Sleep(1000);
               
            });
            thread.Start();
            Console.ReadLine();
        }
    }
}

程序B:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;
 
namespace mutexbbb
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread threadb = new Thread(delegate()
            {
                // 参数(bool,互斥体名称,只有两个应用中互斥体名称相同时,才是系统互斥)
                Mutex mutexbb = new Mutex(false, "MutexForTimeRecordFile");
                string content = @"F:codeFilesfile.txt";
                try
                {
                    for (int i = 0; i < 10; i++)
                    {
                        mutexbb.WaitOne();
                        File.AppendAllText(content, "metuxbbb" + DateTime.Now + "

");
                    }
                    Console.WriteLine("线程b开启");
                }
                catch (Exception qq)
                {
                    Console.WriteLine("线程b被中断");
                }
                finally
                {
                    mutexbb.ReleaseMutex();
                }
                Thread.Sleep(1000);
            });
            threadb.Start();
// 打开另一个应用程序
            System.Diagnostics.Process.Start("mutexaaa.exe");
            Console.ReadLine();
        }
    }
}

以上两个程序是控制台应用程序。可以运行查看下效果。

有好的建议,请在下方输入你的评论。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法与数据结构(六)

一、图 一、临接表 表示方法如下&#xff1a; 带权值的无向图的构建&#xff1a; #define MaxInt 32767 // 极大值 #define MVNum 100 // 最大定点数 typedef int ArcType; // 边的权值类型 typedef char VerTexType; // 顶点数据类型//弧(边)的结点结构 st…

adb: failed to install .\xxxxxx.apk: Failure [INSTALL_FAILED_USER_RESTRICTED

开发者模式和USB调试均已打开&#xff0c;adb安装时报错。看了一下&#xff0c;小米手机还需要开启USB安装才行。 问题已解决

注册-Springboot整合邮件发送

1.QQ邮箱开启服务 获取授权码 2.在配置文件进行相关配置 spring:mail:host: smtp.qq.comport: 587username: xxxpassword: xxxdefault-encoding: utf-8properties:mail:smtp:connectiontimeout: 5000timeout: 3000writetimeout: 5000 3.读取配置类 /*** 读取yml配置文件里面…

乞丐版的四层负载均衡,你了解多少?

大家好&#xff0c;我是蓝胖子&#xff0c;做开发的同学应该经常听到过负载均衡的概念&#xff0c;今天我们就来实现一个乞丐版的四层负载均衡&#xff0c;并用它对mysql进行负载均衡测试&#xff0c;通过本篇你可以了解到零拷贝的应用&#xff0c;四层负载均衡的本质以及实践。…

深入解析Redis的LRU与LFU算法实现

作者&#xff1a;vivo 互联网服务器团队 - Luo Jianxin 重点介绍了Redis的LRU与LFU算法实现&#xff0c;并分析总结了两种算法的实现效果以及存在的问题。 一、前言 Redis是一款基于内存的高性能NoSQL数据库&#xff0c;数据都缓存在内存里&#xff0c; 这使得Redis可以每秒轻…

矩阵的压缩存储

本文主要内容&#xff1a;本文主要介绍几种特殊矩阵的压缩存储。特殊矩阵指具有许多相同矩阵元素或零元素&#xff0c;并且这些相同矩阵元素的分布有一定规律性的矩阵&#xff0c;常见的特殊矩阵有对称矩阵、上&#xff08;下&#xff09;三角矩阵、对角矩阵等。压缩存储指为多…

Vite按需引入自定义组件unplugin-vue-components

1.安装插件 npm i unplugin-vue-components -D 2.vite.config.ts文件加如下代码 plugins: [vue({reactivityTransform: true}),Components({extensions: [vue, md],include: [/\.vue$/, /\.vue\?vue/, /\.md$/],dts: src/components.d.ts,deep: true, // 搜索子目录dirs: [s…

MySQL体系结构及各结构的功能

MySQL体系结构 MySQL的体系结构实际就是MySQL数据库是由那些部分构成&#xff0c;每个部分的具体作用是什么。 Connectors&#xff1a; 用于不同的编程语言连接MySQL数据库&#xff0c;即对外提供的API。 Management Service &Utilities&#xff1a; 用于管理系统&…

Android studio实现网上订餐app

目录 一.应用分析 1.1应用总体描述 1.2应用开发环境 1.3应用模块说明 二.效果展示 2.1店铺界面 2.2店铺详情界面 2.3菜品详情界面 2.4订单界面 三.服务器数据准备 四.店铺功能业务实现 4.1搭建标题栏布局 1.创建项目 2.导入界面图片 3&#xff0e;搭建标题栏布局…

旅游卡小程序分销系统开发

旅游业的不断发展&#xff0c;旅游卡作为一种便捷的旅游方式越来越受到人们的青睐。为了吸引更多的游客&#xff0c;许多旅游卡品牌开始推出各种优惠活动&#xff0c;例如折扣、免费景点等。为了实现这些优惠活动&#xff0c;旅游卡品牌需要开发一款小程序分销系统&#xff0c;…

主成分分析系列(一)概览及为什么数据要中心化

一、概览 主成分分析&#xff08;Principle Component Analysis&#xff0c;PCA&#xff09;算法属于数据降维算法里面的一种。数据降维算法的主要想法是从高维度数据中找到一种结构&#xff0c;这种结构蕴含了数据中的大部分信息&#xff0c;从而将高维数据降维到低维数据&am…

开利网络受邀参与广州三会数字化转型主题研讨会

7月4日&#xff0c;开利网络受邀来到位于广州黄埔的视源集团总部&#xff0c;参与由广州三会组织的企业数字化转型主题系列研讨会。降本增效是企业经营的重要目标&#xff0c;本次数字化转型议题则从“会议”这一要素出发&#xff0c;探讨如何利用软硬件技术能力帮助企业完成会…

《疯狂Android讲义》第2版 第3.5.2节关于Handler的代码

类似定时切换商品效果&#xff1a; 布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-…

Python自动化测试面试题(精选版)

目录 项目相关 测试框架 测试工具 测试方法 Python基础 ​&#x1f381;更多干货 完整版文档下载方式&#xff1a; 今天由凡哥给你介绍一些Python自动化测试中常见的面试题&#xff0c;涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容&#xff0c;希望能够…

华为OD机试真题 Python 实现【优秀学员统计】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、解题思路六、Python算法源码七、效果展示1、输入2、输出3、说明 一、题目描述 公司某部门软件教导团正在组织新员工每日打卡学习活动&#xff0c;他们开展这项学习活动已经一个月了&#xff0c;所以想统计下这个月优…

pdf转ppt怎么转换?分享这几个方法给大家!

将PDF文件转换为PPT演示文稿是一项常见需求&#xff0c;无论是为了编辑、演示还是共享文件。 随着信息技术的不断进步&#xff0c;我们经常遇到需要将PDF文件转换为PPT演示文稿的情况。以下是四种简便的方法&#xff0c;供大家参考。 方法一&#xff1a;使用记灵在线工具 通…

Salesforce Associate认证考试指南来啦!(内含备考攻略)

Salesforce Associate认证是一项全新的入门级认证&#xff0c;针对0-6个月Salesforce经验的学习者。这一新认证不再强调实践专业知识&#xff0c;而是验证并增强那些拥有Salesforce基础知识的备考者。这些知识包括了解CRM平台的用途、解决的业务需求&#xff0c;以及如何使用Sa…

若依管理系统包名修改工具下载,使用教程(本人实测有效)

下载地址&#xff1a; 若依官网指定下载-Gitee包名修改文件下载地址 使用方法&#xff1a; 1.选择文件的地方需要选择zip压缩文件&#xff0c;把从若依官网拉下来的代码压缩成zip文件即可

Django实现简单的音乐播放器 3

在原有音乐播放器上请求方式优化和增加加载本地音乐功能。 效果&#xff1a; 目录 播放列表优化 设置csrf_token 前端改为post请求 视图端增加post验证 加载歌曲 视图 设置路由 模板 加载layui css 加载layui js 增加功能列表 功能列表脚本实现 最终效果 总结 播…

分布式监控之Zabbix6.0监控系统一

分布式监控之Zabbix6.0监控系统 前言一、Zabbix1、介绍2、zabbix监控原理3、Zabbix6.0版本新特性4、Zabbix6.0功能组件5、Zabbix与Prometheus对比 二、Zabbix6.0部署1、部署zabbix服务端2、添加 zabbix 客户端主机3、自定义监控内容4、zabbix 自动发现5、zabbix 自动注册 前言 …