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


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



目录
相关文章
|
4月前
|
数据采集 XML JavaScript
C# 中 ScrapySharp 的多线程下载策略
C# 中 ScrapySharp 的多线程下载策略
|
2月前
|
安全 Linux
Linux线程(十一)线程互斥锁-条件变量详解
Linux线程(十一)线程互斥锁-条件变量详解
|
3月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
82 0
|
4月前
|
Java C语言 C++
并发编程进阶:线程同步与互斥
并发编程进阶:线程同步与互斥
43 0
|
4月前
|
算法 Java 调度
【多线程面试题二十】、 如何实现互斥锁(mutex)?
这篇文章讨论了在Java中实现互斥锁(mutex)的两种方式:使用`synchronized`关键字进行块结构同步,以及使用`java.util.concurrent.locks.Lock`接口进行非块结构同步,后者提供了更灵活的同步机制和扩展性。
|
4月前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
50 0
|
6月前
|
API
linux---线程互斥锁总结及代码实现
linux---线程互斥锁总结及代码实现
|
5月前
|
安全 算法 Linux
【Linux】线程安全——补充|互斥、锁|同步、条件变量(下)
【Linux】线程安全——补充|互斥、锁|同步、条件变量(下)
51 0
|
5月前
|
存储 安全 Linux
【Linux】线程安全——补充|互斥、锁|同步、条件变量(上)
【Linux】线程安全——补充|互斥、锁|同步、条件变量(上)
59 0