C# 多线程编程之锁的使用【互斥锁(lock)和读写锁(ReaderWriterLock )】

今天主要介绍下C#的两种锁:互斥锁(lock)和读写锁(ReaderWriterLock)

互斥锁(lock)

lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。当任何一个线程获取到锁后,其他线程如果需要使用该临界区内代码,则必须等待前一个线程使用完毕后释放锁。

代码示例:

Object thisLock = new Object();
lock (thisLock)
{
    // 临界区代码块
}

读写锁(ReaderWriterLock )

ReaderWriterLock 定义支持单个写线程和多个读线程的锁。该锁的作用主要是解决并发读的性能问题,使用该锁,可以大大提高数据并发访问的性能,只有在写时,才会阻塞所有的读锁。

示例代码:

using System.Collections.Generic;
using System.Windows;
using System.Threading;


namespace FYSTest
{
    public partial class MainWindow : Window
    {
        List<int> list = new List<int>();
        private ReaderWriterLock _rwlock = new ReaderWriterLock();

        public MainWindow()
        {
            InitializeComponent();
            Thread ThRead = new Thread(new ThreadStart(Read));
            ThRead.IsBackground = true;
            Thread ThRead2 = new Thread(new ThreadStart(Read));
            ThRead2.IsBackground = true;
            Thread ThWrite = new Thread(new ThreadStart(Write));
            ThWrite.IsBackground = true;
            ThRead.Start();
            ThRead2.Start();
            ThWrite.Start();
        }

        private void Read()
        {
            while (true)
            {
                //使用一个 System.Int32 超时值获取读线程锁。
                _rwlock.AcquireReaderLock(100);
                try
                {
                    if (list.Count > 0)
                    {
                        int result = list[list.Count - 1];
                    }
                }
                finally
                {
                    //减少锁计数,释放锁
                    _rwlock.ReleaseReaderLock();
                }
            }
        }

        int WriteCount = 0;//写次数
        private void Write()
        {
            while (true)
            {
                //使用一个 System.Int32 超时值获取写线程锁。
                _rwlock.AcquireWriterLock(100);
                try
                {
                    list.Add(WriteCount++);
                }
                finally
                {
                    //减少写线程锁上的锁计数,释放写锁
                    _rwlock.ReleaseWriterLock();
                }
            }
        }
    }
}


  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,可以使用多个互斥锁来实现多线程的同步。互斥锁是一种同步机制,用于保护共享资源,一次只允许一个线程访问被锁定的代码块。下面是使用多个互斥锁的示例代码: ```csharp using System; using System.Threading; class Program { static Mutex mutex1 = new Mutex(); static Mutex mutex2 = new Mutex(); static void Main() { // 创建两个线程 Thread thread1 = new Thread(DoWork1); Thread thread2 = new Thread(DoWork2); // 启动线程 thread1.Start(); thread2.Start(); // 等待两个线程执行完毕 thread1.Join(); thread2.Join(); Console.WriteLine("Press any key to exit."); Console.ReadKey(); } static void DoWork1() { Console.WriteLine("Thread 1 is waiting for mutex1..."); mutex1.WaitOne(); Console.WriteLine("Thread 1 acquired mutex1. Doing some work..."); // 模拟耗时操作 Thread.Sleep(2000); Console.WriteLine("Thread 1 is waiting for mutex2..."); mutex2.WaitOne(); Console.WriteLine("Thread 1 acquired mutex2. Continuing work..."); // 执行一些其他操作 // 释放互斥锁 mutex2.ReleaseMutex(); mutex1.ReleaseMutex(); } static void DoWork2() { Console.WriteLine("Thread 2 is waiting for mutex2..."); mutex2.WaitOne(); Console.WriteLine("Thread 2 acquired mutex2. Doing some work..."); // 模拟耗时操作 Thread.Sleep(2000); Console.WriteLine("Thread 2 is waiting for mutex1..."); mutex1.WaitOne(); Console.WriteLine("Thread 2 acquired mutex1. Continuing work..."); // 执行一些其他操作 // 释放互斥锁 mutex1.ReleaseMutex(); mutex2.ReleaseMutex(); } } ``` 在上面的示例中,我们创建了两个互斥锁 `mutex1` 和 `mutex2`,并且分别在 `DoWork1` 和 `DoWork2` 方法中使用了这两个互斥锁来保护共享资源。注意,在获取互斥锁之后,需要在适当的时候释放互斥锁,以便其他线程可以获取它们。 请注意,使用多个互斥锁可能会导致死锁问题,因此在设计多线程应用程序时需要小心处理锁的使用顺序和释放顺序,以避免死锁情况的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值