您的位置:首页 > 编程语言 > C#

C# 多线程 AutoResetEvent和ManualResetEvent

2017-04-20 17:19 357 查看
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();//解锁买书线程

            }

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: