美文网首页
C#实现两个线程同步

C#实现两个线程同步

作者: 清远_03d9 | 来源:发表于2019-08-24 23:43 被阅读0次

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);
        }
    }
}

相关文章

  • C#学习笔记

    C#中的线程(一)入门 C#中的线程(二) 线程同步基础 C#中的线程(三) 使用多线程 20190130补充: ...

  • C#实现两个线程同步

    1. 下面我们使用EventWaitHandle类实现线程的同步 EventWaitHandle类:能让操作系统通...

  • C# 线程同步

    多个线程同时使用共享对象,这种情形被称为竞争条件(Race Condition),竞争条件是多线程环境中非常常见的...

  • 线程锁

    探讨iOS开发中各种锁使用NSCondition实现多线程同步 NSCondition是线程同步, 阻塞线程。 取...

  • [C# 线程处理系列]专题四:线程同步

    目录: 一、线程同步概述 二、线程同步的使用 三 、总结 一、线程同步概述 前面的文章都是讲创建多线程来实现让我们...

  • java同步线程(三)

    **java同步线程(三)** 基本实现方式及同步原理---释放同步监视器的锁定任何线程进入同...

  • Java多线程之线程安全与同步实例

    1.1 线程安全与同步实例 1.1.1 购票同步对象锁 【 /* * 用程序模拟铁路售票系统:实现通过两个售票点...

  • 线程通信

    线程间相互调用 , 主要是wait()和notify()方法的使用.下面小例子实现了简单的线程同步,两个线程间间隔...

  • OC语法_多线程

    1. 多线程实现原理; 2. 多线程实现的方案; 3. 线程同步技术; 1. 多线程实现原理; - 进程:...

  • 第四章多线程访问同步方法的7种情况

    1,两个线程同时访问一个对象的同步方法同步(互斥)执行2,两个线程访问的是两个对象的同步方法可同时执行3,两个线程...

网友评论

      本文标题:C#实现两个线程同步

      本文链接:https://www.haomeiwen.com/subject/dppcectx.html