当前位置:网站首页>C#(四十三)之线程Mutex互斥
C#(四十三)之线程Mutex互斥
2022-07-20 23:23:00 【camellias_】
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();
}
}
}
以上两个程序是控制台应用程序。可以运行查看下效果。
有好的建议,请在下方输入你的评论。
欢迎访问个人博客
https://guanchao.site
欢迎访问小程序:
边栏推荐
- Outofmemoryerror troubleshooting of memory overflow
- MD编辑器 - Typora
- TZC 1283: 简单排序 —— 归并排序
- YOLOv7实验测试之一:遥感图像检测应用
- 华为无线设备配置Airtime调度
- 进程的创建(创建原语,引起其发生的事件)
- [method] determine whether exe or DLL is 32-bit or 64 bit
- Time series analysis of port berths during Arima epidemic
- [solution] VC6.0 cannot be debugged at breakpoints
- 华为无线设备配置不同业务VLAN的AP间非快速漫游
猜你喜欢
Opencv learning - aruco module
超简单的三管无感无刷三相电机驱动板
【无标题】今年值得关注的神书,豆瓣评分高达9.0分,京东当当有售
Huawei wireless devices are configured with non fast roaming between APs of different service VLANs
Starbucks CEO said that more stores may be closed to ensure the safety of employees
JS-添加方式(行内 内嵌 外部)
php-fpm自定义zabbix监控
实践-创建多少线程合适
What resources cannot be shared between threads?
C#(四十五)之线程池
随机推荐
华为无线设备配置不同业务VLAN的AP间非快速漫游
Message queue rockermq development practice
WiFi Authentication&Omnipeek抓包分析
竣达技术丨MOBUS 转SNMP网络监控终端
Replication of complex linked list
What is a video content recommendation engine?
The difference between memory overflow and memory leak
成为比开发更硬气的测试人,我都经历了什么?
Es basic knowledge and common query basis
如何提取Matlab可视化图像窗口Figure中的坐标信息
YOLOv5改进之二:添加CBAM注意力机制
【机器学习】如何在训练过程中挑选比较好的模型保存(pytorch)
整理的burp官网的漏洞语句
(c语言)柔性数组
进程的组织方式:链接方式和索引方式
进程的创建(创建原语,引起其发生的事件)
MySQL common operations and basic queries
Deep learning method of convolutional neural network single image super-resolution
TZC 1283: 简单排序 —— 归并排序
[基础架构] [Flink] Flink/Flink-CDC代码实现业务接入