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

简介: Mutex(互斥体):排他性的使用共享资源称为线程间的互斥。使用Mutex类要比使用monitor类消耗更多的系统资源,但他可以跨越多个应用程序,在多个应用程序间同步。

QQ图片20220426162633.jpg

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();
        }
    }
}


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



目录
相关文章
|
6天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
6天前
|
安全 Java
深入Java并发编程:线程同步与互斥机制
【4月更文挑战第6天】Java并发编程中,确保数据一致性与防止条件竞争是关键。语言提供`synchronized`关键字、`Lock`接口和原子变量等机制处理并发问题。线程同步问题包括竞态条件、死锁和活锁。`synchronized`实现内置锁,`Lock`接口提供更灵活的锁管理,原子变量则支持无锁安全操作。理解并恰当使用这些工具能有效管理并发,避免数据不一致。
|
6天前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
6天前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
6天前
|
Linux API C++
c++多线程——互斥锁
c++多线程——互斥锁
|
6天前
|
安全 Java C#
C#多线程详解
C#多线程详解
14 0
|
6天前
|
算法 安全 Linux
【探索Linux】P.20(多线程 | 线程互斥 | 互斥锁 | 死锁 | 资源饥饿)
【探索Linux】P.20(多线程 | 线程互斥 | 互斥锁 | 死锁 | 资源饥饿)
13 0
|
6天前
|
安全 Linux 调度
【linux线程(二)】线程互斥与线程同步
【linux线程(二)】线程互斥与线程同步
|
6天前
|
传感器 安全 程序员
【C++多线程 同步机制】:探索 从互斥锁到C++20 同步机制的进化与应用
【C++多线程 同步机制】:探索 从互斥锁到C++20 同步机制的进化与应用
108 1
|
6天前
|
安全 C++ 开发者
【C++多线程同步】C++多线程同步和互斥的关键:std::mutex和相关类的全面使用教程与深度解析
【C++多线程同步】C++多线程同步和互斥的关键:std::mutex和相关类的全面使用教程与深度解析
21 0