Tuesday, 3 June 2014

Пример синхронизации двух потоков с помощью AutoResetEvent на C#

В этом простом примере задача стояла так: с помощью двух потоков выводить последовательно буквы А и В, при этом

- один поток выводит только А, второй только В,
- буквы должны строго чередоваться
- первой должна быть выведена буква А

Это реализовано с помощью класса Tester, в котором запускаются два потока, синхронизированные с помощью двух соответствующих каждому потоку объектов AutoResetEvent.

Текст класса:

using System;
using System.Threading;
 
namespace AutoResetEvent
{
    /// <summary>
    /// A and B should be in ABAB order and A should be always typed first
    /// </summary>
    internal class Tester
    {
        private EventWaitHandle ev1 = new System.Threading.AutoResetEvent(false);
        private EventWaitHandle ev2 = new System.Threading.AutoResetEvent(false);
        private Thread thread1;
        private Thread thread2;
        private bool initialized = false;
        private object locker = new object();
 
        public void Start()
        {
            thread1 = new Thread(Worker1);
            ev1.Set();
            thread1.Start();
            thread2 = new Thread(Worker2);
            thread2.Start();
        }
 
        public void Stop()
        {
            thread1.Abort();
            thread2.Abort();
        }
 
        private void Worker1()
        {
            while (true)
            {
                ev1.WaitOne();
                Console.WriteLine("A");
                ev2.Set();
            }
        }
 
        private void Worker2()
        {
            while (true)
            {
                ev2.WaitOne();
                Console.WriteLine("B");
                ev1.Set();
            }
        }
    }
}

No comments:

Post a Comment