C# 多线程 AutoResetEvent和ManualResetEvent

来源:互联网 发布:投稿系统php源码 编辑:程序博客网 时间:2024/05/18 18:02
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;


namespace MutiThreadTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread SeekBookThread = new Thread(new ThreadStart(TestMutiThrd.SeekProc));
            SeekBookThread.Name = "扫描线程";
            SeekBookThread.Start();


            Thread payMoneyThread = new Thread(new ThreadStart(TestMutiThrd.PayMoneyProc));
            payMoneyThread.Name = "付钱线程";
            payMoneyThread.Start();


            Thread getBookThread = new Thread(new ThreadStart(TestMutiThrd.GetBookProc));
            getBookThread.Name = "取书线程";
            getBookThread.Start();


            for (int i = 1; i <= TestMutiThrd.numIterations; i++)
            {
                Console.WriteLine("买书线程:书本{0}", i);
                TestMutiThrd.number = i;
                //Signal that a value has been written.
                TestMutiThrd.SekEvent.Set();//解锁扫描线程
                TestMutiThrd.buyResetEvent.WaitOne();//等待买书所有线程执行结束,才能继续
                Thread.Sleep(0);
            }
            Thread.Sleep(1000);
            Console.ReadLine();
            SeekBookThread.Abort();
            payMoneyThread.Abort();
            getBookThread.Abort();
        }
    }


    public class TestMutiThrd
    {
        public const int numIterations = 10;
        //买书
        public static AutoResetEvent buyResetEvent = new AutoResetEvent(false);
        //扫描
        public static AutoResetEvent SekEvent = new AutoResetEvent(false);
        //付钱
        public static AutoResetEvent PayEvent = new AutoResetEvent(false);
        //取书
        public static AutoResetEvent GetEvent = new AutoResetEvent(false);
        //付钱和取书
        public static ManualResetEvent PayGetEvent = new ManualResetEvent(false);


        public static ReaderWriterLock RWLock = new ReaderWriterLock();
        //static ManualResetEvent myResetEvent = new ManualResetEvent(false);
        //static ManualResetEvent ChangeEvent = new ManualResetEvent(false);
        public static int number; //这是关键资源
        public static TestMutiThrd OTestMutiThrd = new TestMutiThrd();


        public int NumIterations
        {
            get
            {
                return numIterations;
            }
        }


        /// <summary>
        /// 扫描过程
        /// </summary>
        public static void SeekProc()
        {
            while (true)
            {
                SekEvent.WaitOne();
                //SekEvent.Reset();
                Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number);
                Thread.Sleep(0);
                //PayEvent.Set();//解锁付款线程
                PayGetEvent.Set();//同时解锁付款和取书线程
            }
        }


        /// <summary>
        /// 付钱过程
        /// </summary>
        public static void PayMoneyProc()
        {
            while (true)
            {
                PayGetEvent.WaitOne();
                //PayEvent.WaitOne();
                Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number);
                Thread.Sleep(10);
                //GetEvent.Set();//解锁取书线程
            }
        }


        /// <summary>
        /// 取书过程
        /// </summary>
        public static void GetBookProc()
        {
            while (true)
            {
                PayGetEvent.WaitOne();
                PayGetEvent.Reset();//不加 无限执行下去
                //GetEvent.WaitOne();         
                Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number);
                Console.WriteLine("------------------------------------------");
                Thread.Sleep(10);
                buyResetEvent.Set();//解锁买书线程
            }
        }
    }
}
0 0