C#实现两个线程同步

2019-08-24  本文已影响0人  清远_03d9

1. 下面我们使用EventWaitHandle类实现线程的同步

  • EventWaitHandle类:能让操作系统通过发出的信号完成多个线程之间的同步,需要同步的线程可以阻塞当前线程。
  • 根据Windows操作系统发出的信号,决定阻塞等待其他工作完成,还是不再等待而直接继续执行
  • EventWaitHandle类方法如下:
    (1) Reset
    将信号的状态置为非终止状态(不让操作系统发出信号),从而导致那些只有收到信号才能继续执行的线程处于阻塞状态;
    (2) Set
    将事件状态置为非终止状态,这样等待的线程会收到信号,从而有等待转为继续执行;
    (3) WaitOne
    阻塞当前线程,等待操作系统为其发出信号,直到收到信号才解除阻塞
    操作系统发出信号的两种方式:
    (1) AutoResetEvent
    发一个信号,使某个等待信号的线程解除阻塞,继续执行.自动重置()
    (2) ManualRestEvent

发一个信号,使所有等待信号的线程全部解除阻塞,继续执行.手动重置

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadAsyDemo2
{
    class Program
    {
        private int n1, n2, n3;
        //将信号状态设置为非终止状态,使用手动重置
        EventWaitHandle myEventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
        static void Main(string[] args)
        {
            Program p = new Program();
            Thread t0 = new Thread(new ThreadStart(p.WriteThread));
            Thread t1 = new Thread(new ThreadStart(p.ReadThread));
            t0.Start();
            t1.Start();
            Console.ReadLine();
        }
        private void WriteThread()
        {
            //允许其他需要等待的线程阻塞
            myEventWaitHandle.Reset();
            Console.WriteLine("WriteThread");
            n1 = 1;
            n2 = 2;
            n3 = 3;
            //允许其他等待的线程继续
            myEventWaitHandle.Set();
        }
        //有时结果为0+0+0=0;有时结果为1+2+3=6;因为线程执行循序是不确定性导致。
        //我们需要结果始终是1+2+3=6;这个需要保证WriteThread()比ReadThread()早执行。这个就涉及到线程的同步问题。

        private void ReadThread()
        {
            //阻塞当前线程,直到收到信号
            myEventWaitHandle.WaitOne();
            Console.WriteLine("{0}+{1}+{2}={3}", n1, n2, n3, n1 + n2 + n3);
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读