Search code examples
c#multithreadingautoresetevent

Synchronizing two threads with AutoResetEvent


I'm trying to implement AutoResetEvent. For the purpose I use a very simple class :

public class MyThreadTest
{
    static readonly AutoResetEvent thread1Step = new AutoResetEvent(false);
    static readonly AutoResetEvent thread2Step = new AutoResetEvent(false);

    void DisplayThread1()
    {
        while (true)
        {
            Console.WriteLine("Display Thread 1");

            Thread.Sleep(1000);
            thread1Step.Set();
            thread2Step.WaitOne();
        }
    }

    void DisplayThread2()
    {
        while (true)
        {
            Console.WriteLine("Display Thread 2");
            Thread.Sleep(1000);
            thread2Step.Set();
            thread1Step.WaitOne();
        }
    }

    void CreateThreads()
    {
        // construct two threads for our demonstration;
        Thread thread1 = new Thread(new ThreadStart(DisplayThread1));
        Thread thread2 = new Thread(new ThreadStart(DisplayThread2));

        // start them
        thread1.Start();
        thread2.Start();
    }

    public static void Main()
    {
        MyThreadTest StartMultiThreads = new MyThreadTest();
        StartMultiThreads.CreateThreads();
    }
}

But this is not working. Th usage seem very straight-forward so I would appreciate if someone is able to show me what's wrong and where is the problem with the logic which i implement here.


Solution

  • The question is not very clear but I'm guessing you're expecting it to display 1,2,1,2...

    Then try this:

    public class MyThreadTest
    {
        static readonly AutoResetEvent thread1Step = new AutoResetEvent(false);
        static readonly AutoResetEvent thread2Step = new AutoResetEvent(true);
    
        void DisplayThread1()
        {
            while (true)
            {
                thread2Step.WaitOne(); 
                Console.WriteLine("Display Thread 1");
                Thread.Sleep(1000);
                thread1Step.Set();
            }
        }
    
        void DisplayThread2()
        {
            while (true)
            {
                thread1Step.WaitOne(); 
                Console.WriteLine("Display Thread 2");
                Thread.Sleep(1000);
                thread2Step.Set();
            }
        }
    
        void CreateThreads()
        {
            // construct two threads for our demonstration;
            Thread thread1 = new Thread(new ThreadStart(DisplayThread1));
            Thread thread2 = new Thread(new ThreadStart(DisplayThread2));
    
            // start them
            thread1.Start();
            thread2.Start();
        }
    
        public static void Main()
        {
            MyThreadTest StartMultiThreads = new MyThreadTest();
            StartMultiThreads.CreateThreads();
        }
    }