LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

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

freeflydom
2024年7月30日 11:10 本文热度 727

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

        }

    }

}

 

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

    }

}

 

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

    }

}

 

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

    }

}

 

SemaphoreSlim:

定义:SemaphoreSlim 是轻量级的信号量,与 Semaphore 类似,用于控制同时访问共享资源的线程数量,但相比 Semaphore 更轻量级。

优点:相比 Semaphore,SemaphoreSlim 的开销更小,适用于资源访问频繁的场景。

缺点:与 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();

    }

}

 

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

        }

    }

}


转自https://www.cnblogs.com/INetIMVC/p/18330485


该文章在 2024/7/30 11:10:12 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved