c# 多线程环境下控制对共享资源访问的解决方法

 更新时间:2024年07月30日 09:37:46   作者:我只吃饭不洗碗  
这篇文章主要介绍了c# 多线程环境下控制对共享资源访问的解决方法,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

c# 多线程环境下控制对共享资源访问的办法

  • Monitor:
    • 定义:Monitor 是 C# 中最基本的同步机制,通过 Enter 和 Exit 方法来控制对共享资源的访问。它提供了排他锁的功能,确保在任何时刻只有一个线程可以访问共享资源。
    • 优点:简单易用,适合对临界区进行粗粒度的同步控制。
    • 缺点:只能实现排它锁,不能实现读写锁,性能相对较低。
  class Program
{
    static readonly object _lock = new object();
    static int _counter = 0;
    static void Main()
    {
        for (int i = 0; i < 10; i++)
        {
            new Thread(IncrementCounter).Start();
        }
        Console.ReadKey();
    }
    static void IncrementCounter()
    {
        Monitor.Enter(_lock);
        try
        {
            _counter++;
            Console.WriteLine($"Counter: {_counter}");
        }
        finally
        {
            Monitor.Exit(_lock);
        }
    }
}
Monitor
  • Mutex:
    • 定义:Mutex 是一个操作系统对象,用于在进程间共享,通过 WaitOne 和 ReleaseMutex 来控制对共享资源的访问。它提供了进程间的同步能力。
    • 优点:可跨进程使用,适合在进程间进行同步。
    • 缺点:相比 Monitor,性能开销较大,因为涉及到系统调用。
  class Program
{
    static Mutex _mutex = new Mutex();
    static int _counter = 0;
    static void Main()
    {
        for (int i = 0; i < 10; i++)
        {
            new Thread(IncrementCounter).Start();
        }
        Console.ReadKey();
    }
    static void IncrementCounter()
    {
        _mutex.WaitOne();
        _counter++;
        Console.WriteLine($"Counter: {_counter}");
        _mutex.ReleaseMutex();
    }
}
Mutex
  • ReaderWriterLockSlim:
    • 定义:ReaderWriterLockSlim 实现了读写分离锁,允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这种机制适用于读多写少的场景。
    • 优点:适合读多写少的场景,提高了并发性能。
    • 缺点:相对复杂,可能会引起死锁,不支持递归锁。
class Program
{
    static ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim();
    static int _counter = 0;
    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            new Thread(ReadCounter).Start();
            new Thread(IncrementCounter).Start();
        }
        Console.ReadKey();
    }
    static void ReadCounter()
    {
        _rwLock.EnterReadLock();
        Console.WriteLine($"Counter: {_counter}");
        _rwLock.ExitReadLock();
    }
    static void IncrementCounter()
    {
        _rwLock.EnterWriteLock();
        _counter++;
        Console.WriteLine($"Counter incremented to: {_counter}");
        _rwLock.ExitWriteLock();
    }
}
ReaderWriterLockSlim
  • Semaphore:
    • 定义:Semaphore 是一个信号量,用于控制同时访问共享资源的线程数量。通过 WaitOne 和 Release 方法,可以控制访问资源的线程数量。
    • 优点:可以控制多个线程同时访问共享资源的数量,灵活性较高。
    • 缺点:相对于其他机制,使用起来较为复杂,需要谨慎处理信号量的释放。
  class Program
{
    static Semaphore _semaphore = new Semaphore(2, 2); // Allow 2 threads to access the resource simultaneously
    static int _counter = 0;
    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            new Thread(IncrementCounter).Start();
        }
        Console.ReadKey();
    }
    static void IncrementCounter()
    {
        _semaphore.WaitOne();
        _counter++;
        Console.WriteLine($"Counter: {_counter}");
        _semaphore.Release();
    }
}
Semaphore
  • SemaphoreSlim:
    • 定义:SemaphoreSlim 是轻量级的信号量,与 Semaphore 类似,用于控制同时访问共享资源的线程数量,但相比 Semaphore 更轻量级。
    • 优点:相比 SemaphoreSemaphoreSlim 的开销更小,适用于资源访问频繁的场景。
    • 缺点:与 Semaphore 相比,功能上略有限制,例如没有 Release(Int32) 方法,只能递增信号量一个单位。
class Program
{
    static SemaphoreSlim _semaphore = new SemaphoreSlim(2, 2); // Allow 2 threads to access the resource simultaneously
    static int _counter = 0;
    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            new Thread(IncrementCounter).Start();
        }
        Console.ReadKey();
    }
    static void IncrementCounter()
    {
        _semaphore.Wait();
        _counter++;
        Console.WriteLine($"Counter: {_counter}");
        _semaphore.Release();
    }
}
SemaphoreSlim
  • lock:
    • 定义:lock 是 C# 中的关键字,用于在代码块级别实现互斥锁,保护共享资源不被多个线程同时访问。
    • 优点:简单易用,适合对临界区进行细粒度的同步控制,编写起来比较方便。
    • 缺点:只能用于单线程内部的同步,不能跨越线程或进程,如果不小心使用会导致死锁。
class Program
{
    static readonly object _lock = new object();
    static int _counter = 0;
    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            new Thread(IncrementCounter).Start();
        }
        Console.ReadKey();
    }
    static void IncrementCounter()
    {
        lock (_lock)
        {
            _counter++;
            Console.WriteLine($"Counter: {_counter}");
        }
    }
}
lock

到此这篇关于c# 多线程环境下控制对共享资源访问的办法的文章就介绍到这了,更多相关c# 共享资源访问内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#网页信息采集方法汇总

    C#网页信息采集方法汇总

    这篇文章主要介绍了C#网页信息采集方法,实例汇总了三种常用的方法,是非常实用的技巧,需要的朋友可以参考下
    2014-10-10
  • C#中lock死锁实例教程

    C#中lock死锁实例教程

    这篇文章主要介绍了C#中lock死锁的用法,对于共享资源的访问及C#程序设计的安全性而言,有着非常重要的意义!需要的朋友可以参考下
    2014-08-08
  • C#循环与循环控制的表达式树实现

    C#循环与循环控制的表达式树实现

    这篇文章介绍了C#循环与循环控制的表达式树实现,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • C#如何控制IIS动态添加删除网站详解

    C#如何控制IIS动态添加删除网站详解

    这篇文章主要给大家介绍了关于C#如何控制IIS动态添加删除网站的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 详解C#中的Async和Await用法

    详解C#中的Async和Await用法

    这篇文章主要介绍了C#中的Async和Await用法,包括在C#5.0下一些新特性的影响,需要的朋友可以参考下
    2015-07-07
  • C#实现把dgv里的数据完整的复制到一张内存表的方法

    C#实现把dgv里的数据完整的复制到一张内存表的方法

    这篇文章主要介绍了C#实现把dgv里的数据完整的复制到一张内存表的方法,需要的朋友可以参考下
    2014-08-08
  • C#实现Windows Form调用R进行绘图与显示的方法

    C#实现Windows Form调用R进行绘图与显示的方法

    众所周知R软件功能非常强大,可以很好的进行各类统计,并能输出图形。下面介绍一种R语言和C#进行通信的方法,并将R绘图结果显示到WinForm UI界面上的方法,文中介绍的很详细,需要的朋友可以参考下。
    2017-02-02
  • WPF+Canvas实现平滑笔迹的示例代码

    WPF+Canvas实现平滑笔迹的示例代码

    这篇文章主要介绍了如何利用WPF+Canvas实现平滑笔迹效果,文中的示例代码讲解详细,对我们学习或工作有一定帮助,需要的可以参考一下
    2022-09-09
  • C#创建自定义控件的示例

    C#创建自定义控件的示例

    这篇文章主要介绍了C#创建自定义控件的示例,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-10-10
  • Oracle中for循环的使用方法

    Oracle中for循环的使用方法

    这篇文章介绍了Oracle中for循环的使用方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08

最新评论