线程同步-手工同步

版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/84674659

.Net还提供了几个手工同步的类,可以使用它们来创建自己的同步机制,手工同步一般用于一下情况:对多线程共享变量的同步访问,线程间或跨进程的同步,实现单个写、多个读的同步。

下面介绍ReadWriterLock类。该类提供单个进程写和多个进程读的控制机制,其优点是资源开销非常低。该类有两个锁,读线程锁与写线程锁。当请求写线程后,在写线程取得访问权之前,不会接受任何新的新的读线程,从而实现多个线程在任何时刻执行读方法,或只允许单个线程在某一时刻执行方法。

运行结果:

源代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Contexts;

namespace Test1_1
{
    class HelloWorld
    {
        static void Main(string[] args)
        {
            Resource r = new Resource();

            Thread t1 = new Thread(new ThreadStart(r.Write));            //创建读线程
            Thread t2 = new Thread(new ThreadStart(r.Write));            //创建读线程
            Thread t3 = new Thread(new ThreadStart(r.Read));            //创建读线程
            Thread t4 = new Thread(new ThreadStart(r.Read));            //创建读线程
            t1.Name = "写线程1";                                         //创建线程名
            t2.Name = "写线程2";
            t3.Name = "读线程1";
            t4.Name = "读线程2";
            
            t1.Start();
            t3.Start();
            t2.Start();
            t4.Start();

            Console.Read();
        }
    }
    public class Resource
    {
        ReaderWriterLock rwl = new ReaderWriterLock();
        private int count = 0;

        public void Read()                                      
        {
            rwl.AcquireReaderLock(Timeout.Infinite);
            try
            {
                Console.WriteLine("+{0}进入读方法 count = {1}", Thread.CurrentThread.Name, count);
                Thread.Sleep(500);
            }
            finally
            {
                rwl.ReleaseReaderLock();
                Console.WriteLine("-{0}离开读方法", Thread.CurrentThread.Name);
            }
            
        }

        public void Write()                                     
        {
            rwl.AcquireWriterLock(Timeout.Infinite);
            try
            {
                ++count;
                Console.WriteLine("+{0}进入写方法 count = {1}", Thread.CurrentThread.Name, count);
                Thread.Sleep(500);
            }
            finally
            {
                rwl.ReleaseWriterLock();
                Console.WriteLine("-{0}离开写方法", Thread.CurrentThread.Name);
            }
        }

    }
}

该实例允许多个线程在任何时刻执行read方法,但只允许在某一个时刻只有一个线程执行Write()方法。写线程1执行Write方法时,其他写线程不能执行Write()方法,如写线程2,直到写线程1离开Write方法,释放了写锁后,才能执行Write方法。而读线程1和读线程2对Read方法可同时进行。

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/84674659