首页 > 其他分享 >什么是线程互斥?

什么是线程互斥?

时间:2024-12-27 17:12:50浏览次数:1  
标签:Console Thread 什么 互斥 线程 WriteLine static id

线程互斥(Thread Mutua lExclusion)是一种同步机制,用于确保在多线程环境中,同一时间只有一个线程可以访问特定的资源或代码段。线程互斥的主要目的是防止多个线程同时修改共享数据,从而避免数据不一致和竞态条件(Race Conditions)。

什么是竞态条件(Race Conditions)?
竞态条件是指程序的输出或行为取决于多个线程执行顺序的情况。当多个线程同时访问和修改共享资源时,如果没有适当的同步机制,可能会导致不可预测的结果。

线程互斥的主要机制:
在 C# 中,有多种机制可以实现线程互斥,以下是常见的几种:

  1. Mutex(互斥体):Mutex 是一种同步基元,可以用于线程间的互斥访问。Mutex 可以是局部的(仅在当前进程内有效)或全局的(跨多个进程有效)。

     using System;
     using System.Threading;
    
     public class MutexExample
     {
     	private static Mutex _mutex;
    
     	public static void Main()
     	{
     		_mutex = new Mutex();
    
     		// 创建两个线程
     		Thread thread1 = new Thread(DoWork);
     		Thread thread2 = new Thread(DoWork);
    
     		thread1.Start();
     		thread2.Start();
    
     		// 等待线程完成
     		thread1.Join();
     		thread2.Join();
    
     		_mutex.Close();
     	}
    
     	public static void DoWork()
     	{
     		Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 尝试获取 Mutex");
     		_mutex.WaitOne(); // 获取 Mutex
     		Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 获取到 Mutex");
    
     		// 执行临界区代码
     		Thread.Sleep(1000);
     		Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 释放 Mutex");
    
     		_mutex.ReleaseMutex(); // 释放 Mutex
     	}
     }
    
  2. Semaphore(信号量):Semaphore 是一种同步基元,允许指定数量的线程同时访问共享资源。信号量可以是局部的或全局的。

     using System;
     using System.Threading;
    
     public class SemaphoreExample
     {
     	private static Semaphore _semaphore;
    
     	public static void Main()
     	{
     		_semaphore = new Semaphore(2, 2); // 允许 2 个线程同时访问
    
     		// 创建多个线程
     		for (int i = 0; i < 5; i++)
     		{
     			Thread thread = new Thread(DoWork);
     			thread.Start(i);
     		}
    
     		// 等待所有线程完成
     		Thread.Sleep(5000);
     	}
    
     	public static void DoWork(object state)
     	{
     		int id = (int)state;
     		Console.WriteLine($"线程 {id} 尝试获取 Semaphore");
     		_semaphore.WaitOne(); // 获取 Semaphore
     		Console.WriteLine($"线程 {id} 获取到 Semaphore");
    
     		// 执行临界区代码
     		Thread.Sleep(1000);
     		Console.WriteLine($"线程 {id} 释放 Semaphore");
    
     		_semaphore.Release(); // 释放 Semaphore
     	}
     }
    
  3. SemaphoreSlim(轻量级信号量):适用于在单个应用程序或进程内使用。

     using System;
     using System.Threading;
    
     public class SemaphoreSlimExample
     {
     	private static SemaphoreSlim _semaphoreSlim;
    
     	public static void Main()
     	{
     		_semaphoreSlim = new SemaphoreSlim(2, 2); // 允许 2 个线程同时访问
    
     		// 创建多个线程
     		for (int i = 0; i < 5; i++)
     		{
     			Thread thread = new Thread(DoWork);
     			thread.Start(i);
     		}
    
     		// 等待所有线程完成
     		Thread.Sleep(5000);
     	}
    
     	public static void DoWork(object state)
     	{
     		int id = (int)state;
     		Console.WriteLine($"线程 {id} 尝试获取 SemaphoreSlim");
     		_semaphoreSlim.Wait(); // 获取 SemaphoreSlim
     		Console.WriteLine($"线程 {id} 获取到 SemaphoreSlim");
    
     		// 执行临界区代码
     		Thread.Sleep(1000);
     		Console.WriteLine($"线程 {id} 释放 SemaphoreSlim");
    
     		_semaphoreSlim.Release(); // 释放 SemaphoreSlim
     	}
     }
    
  4. Lock 语句:适用于单个应用程序或进程内使用。

     using System;
     using System.Threading;
    
     public class LockExample
     {
     	private static readonly object _lock = new object();
    
     	public static void Main()
     	{
     		// 创建多个线程
     		for (int i = 0; i < 5; i++)
     		{
     			Thread thread = new Thread(DoWork);
     			thread.Start(i);
     		}
    
     		// 等待所有线程完成
     		Thread.Sleep(5000);
     	}
    
     	public static void DoWork(object state)
     	{
     		int id = (int)state;
     		Console.WriteLine($"线程 {id} 尝试获取 Lock");
    
     		lock (_lock) // 获取 Lock
     		{
     			Console.WriteLine($"线程 {id} 获取到 Lock");
    
     			// 执行临界区代码
     			Thread.Sleep(1000);
     			Console.WriteLine($"线程 {id} 释放 Lock");
     		}
     	}
     }
    
  5. Monitor 类:提供了更高级的同步机制,可以实现 lock 语句的功能,并且提供了更多的控制选项。

     using System;
     using System.Threading;
    
     public class MonitorExample
     {
     	private static readonly object _lock = new object();
    
     	public static void Main()
     	{
     		// 创建多个线程
     		for (int i = 0; i < 5; i++)
     		{
     			Thread thread = new Thread(DoWork);
     			thread.Start(i);
     		}
    
     		// 等待所有线程完成
     		Thread.Sleep(5000);
     	}
    
     	public static void DoWork(object state)
     	{
     		int id = (int)state;
     		Console.WriteLine($"线程 {id} 尝试获取 Monitor");
    
     		Monitor.Enter(_lock); // 获取 Monitor
     		try
     		{
     			Console.WriteLine($"线程 {id} 获取到 Monitor");
    
     			// 执行临界区代码
     			Thread.Sleep(1000);
     			Console.WriteLine($"线程 {id} 释放 Monitor");
     		}
     		finally
     		{
     			Monitor.Exit(_lock); // 释放 Monitor
     		}
     	}
     }
    
  6. ReaderWriterLockSlim 类:允许多个线程同时进行读操作,但只允许一个线程进行写操作。适用于读操作频繁而写操作较少的场景。

     using System;
     using System.Threading;
    
     public class ReaderWriterLockSlimExample
     {
     	private static readonly ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim();
     	private static int _sharedResource = 0;
    
     	public static void Main()
     	{
     		// 创建多个读线程
     		for (int i = 0; i < 5; i++)
     		{
     			Thread thread = new Thread(ReadResource);
     			thread.Start(i);
     		}
    
     		// 创建多个写线程
     		for (int i = 0; i < 5; i++)
     		{
     			Thread thread = new Thread(WriteResource);
     			thread.Start(i);
     		}
    
     		// 等待所有线程完成
     		Thread.Sleep(5000);
     	}
    
     	public static void ReadResource(object state)
     	{
     		int id = (int)state;
     		Console.WriteLine($"读线程 {id} 尝试获取读锁");
    
     		_rwLock.EnterReadLock();
     		try
     		{
     			Console.WriteLine($"读线程 {id} 获取到读锁");
     			Console.WriteLine($"读线程 {id} 读取资源值: {_sharedResource}");
     			Thread.Sleep(500);
     			Console.WriteLine($"读线程 {id} 释放读锁");
     		}
     		finally
     		{
     			_rwLock.ExitReadLock();
     		}
     	}
    
     	public static void WriteResource(object state)
     	{
     		int id = (int)state;
     		Console.WriteLine($"写线程 {id} 尝试获取写锁");
    
     		_rwLock.EnterWriteLock();
     		try
     		{
     			Console.WriteLine($"写线程 {id} 获取到写锁");
     			_sharedResource++;
     			Console.WriteLine($"写线程 {id} 写入资源值: {_sharedResource}");
     			Thread.Sleep(1000);
     			Console.WriteLine($"写线程 {id} 释放写锁");
     		}
     		finally
     		{
     			_rwLock.ExitWriteLock();
     		}
     	}
     }
    

标签:Console,Thread,什么,互斥,线程,WriteLine,static,id
From: https://www.cnblogs.com/chenshibao/p/18636202

相关文章

  • 在同步方法里调用异步方法可能发生什么?
    在.NET中,如果你在一个同步方法中调用异步方法,可能会导致一些问题和潜在的性能瓶颈。以下是详细的解释和可能的情况:潜在的问题死锁(Deadlock):在同步方法中调用异步方法并使用Wait()或Result可能会导致死锁,特别是在使用SynchronizationContext的情况下(如在WindowsFo......
  • java 多线程处理list集合数据的实例应用
    众所周知创建线程的三种方式:继承Thread,重写run方法实现Runnable接口,重新run方法实现Callable接口,重写call方法下面使用Callable,来说一下为什么使用1.Thread类和Runnable接口都不允许声明检查型异常,也不能定义返回值。没有返回值这点稍微有点麻烦。不能声明抛出检查型异常则......
  • 什么是IOC和AOP?
    什么是IOC?IOC(InversionofControl,控制反转)是一种设计原则,广泛应用于软件设计中,特别是在面向对象编程(OOP)中。IOC的核心思想是将对象的创建和管理从应用程序的代码中分离出来,交给一个外部的容器或框架来处理。这种设计原则有助于提高代码的可维护性、可测试性和模块化程度。IOC......
  • 什么是微服务
    微服务(Microservices)是一种软件架构设计风格,它将应用程序分解为一组小的、独立的服务。每个服务实现特定的业务功能,并且可以独立部署、扩展和维护。这种架构设计旨在提高应用程序的灵活性、可扩展性和可维护性,尤其是在处理复杂和大规模的应用程序时。以下是微服务架构的详细解释......
  • 多线程的实现原理
    多线程编程是一种允许在同一程序中同时执行多个线程的技术,以提高程序的性能和响应性。多线程的实现原理涉及操作系统、编程语言和编译器等多个层面。以下是对多线程实现原理的详细解释:多线程的基本概念线程(Thread):线程是程序执行的基本单元,是操作系统能够进行运算调度的最小单......
  • C#知识整理-多线程
    进程和线程进程是一种正在执行的程序。操作系统使用进程来分隔正在执行的应用程序。线程是操作系统向其分配处理器时间的基本单元。每个线程具有计划优先级并维护系统用于保存线程执行暂停时线程上下文的一组结构。线程上下文包含线程顺畅继续执行所需的全部信息,包括线程的一......
  • 基于Sentinel的服务保护方案的三种方式(请求限流、线程隔离、服务熔断)超详细讲解
    目录1、三种方式介绍1.1请求限流1.2线程隔离方案1.3服务熔断2、基于sentinel实现2.1启动sentinel2.2基于springboot整合sentinel2.2.1请求限流2.2.2请求隔离2.2.2.1 OpenFeign整合Sentinel2.2.3服务熔断2.2.3.1编写降级代码2.2.3.2服务熔断1、三种方......
  • 在牧区使用4G太阳能无线视频监控需要注意什么?
    在辽阔的牧区,太阳能无线监控系统的应用为牧民们带来了极大的便利,不仅提升了牧场的安全管理水平,还有效保护了生态环境和牲畜安全。然而,在牧区这一特殊环境中使用太阳能无线监控系统,也需要注意一系列问题,以确保系统的稳定运行和监控效果。那么在实际应用中,在牧区使用太阳能无线监......
  • 2025新手小白第一次准备参加护网行动,需要准备什么?
    目录第一部分:了解护网行动的背景与目的1.1护网行动的背景1.2护网行动的目的1.3护网行动的主要内容第二部分:网络安全基础知识准备2.1网络安全概念2.2网络安全的常见威胁2.3网络安全防护措施第三部分:护网行动的技术工具与方法3.1网络安全工具3......
  • 为什么选择推广远方好物?
    我老家在益阳沅江,属于南洞庭湖,从小看着农民辛辛苦苦一年劳作挣不了几个钱;以几年前家里养甲鱼为例,2-3年外塘生态养殖的甲鱼,由70多的塘口批发价掉到10多块一斤,温室甲鱼都不是这个收购价,还要求着贩子收购,一斤甲鱼成本至少都要30元,菜贱伤农这种心情不是一般人能理解的,我是亲身经历者。......