本篇通过一个列子使用EventWaitHandle实现两个线程的同步。请参看下面的列子。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace ThreadSynDemo
{
class Program
{
private int n1, n2, n3;
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()
{
Console.WriteLine("WriteThread");
n1 = ;
n2 = ;
n3 = ;
}
//有时结果为0+0+0=0;有时结果为1+2+3=6;因为线程执行循序是不确定性导致。
//我们需要结果始终是1+2+3=6;这个需要保证WriteThread()比ReadThread()早执行。这个就涉及到线程的同步问题。 private void ReadThread()
{
Console.WriteLine("{0}+{1}+{2}={3}",n1,n2,n3,n1+n2+n3);
}
}
}
上面的列子有时结果为0+0+0=0;有时结果为1+2+3=6;因为线程执行循序是不确定性导致。
我们需要结果始终是1+2+3=6;这个需要保证WriteThread()比ReadThread()早执行。这个就涉及到线程的同步问题。
下面我们就用EventWaitHandle实现这两个线程的同步。请看下面的列子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
//下面我们使用EventWaitHandle类实现线程的同步
//EventWaitHandle类:能让操作系统通过发出的信号完成多个线程之间的同步,需要同步的线程可以阻塞当前线程。
// 然后根据Windows操作系统发出的信号,决定阻塞等待其他工作完成,,还是不再等待而直接继续执行
//EventWaitHandle类方法如下:
//(1)Reset将信号的状态置为非终止状态(不让操作系统发出信号),从而导致那些只有收到信号才能继续执行的线程处于阻塞状态
//(2)Set:将事件状态置为终止状态,这样等待的线程会收到信号,从而有等待转为继续执行
//(3)WaitOne方法:阻塞当前线程,等待操作系统为其发出信号,直到收到信号才解除阻塞
//操作系统发出信号的两种方式:
//(1)发一个信号,使某个等待信号的线程解除阻塞,继续执行.自动重置(AutoResetEvent)
//(2)发一个信号,使所有等待信号的线程全部解除阻塞,继续执行.手动重置(ManualRestEvent)
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 = ;
n2 = ;
n3 = ;
//允许其他等待的线程继续
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);
}
}
}
转载至:https://www.cnblogs.com/Joetao/articles/3152497.html

EventWaitHandle 第一课的更多相关文章

  1. vue.js学习(第一课)

    学习资料 来自台湾小凡! vue.js是javascript的一个库,只专注于UI层面,核心价值永远是 API的简洁. 第一课: 不支持IE8. 1.声明式渲染: el元素的简称 element : ...

  2. Magento学习第一课——目录结构介绍

    Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...

  3. <-0基础学python.第一课->

    初衷:我电脑里面的歌曲很久没换了,我想听一下新的歌曲,把他们下载下来听,比如某个榜单的,但是一首一首的点击下载另存为真的很恶心 所以我想有没有办法通过程序的方式来实现,结果还真的有,而且网上已经有有人 ...

  4. 留念 C语言第一课简单的计算器制作

    留念 C语言第一课简单的计算器制作 学C语言这么久了.  /* 留念 C语言第一课简单的计算器制作 */   #include<stdio.h>  #include<stdlib.h ...

  5. MFC学习-第一课 MFC运行机制

    最近由于兴趣爱好,学习了孙鑫的MFC教程的第一课.看完视频了,自己便用visual studio 2010尝试了MFC编程,其中遇到了一些问题. 1.vs2010不像vs6.0那样可以新建一个空的MF ...

  6. OpenCV 第一课(安装与配置)

    OpenCV 第一课(安装与配置) win10,opencv-2.4.13, 安装, vs2013, 配置 下载安装软件 官网OpenCV下载地址下载最新版本,我下载的是opencv.2.4.13,然 ...

  7. 【第一课】神奇的Context

    初学Android的困惑 初学Android跳转页面的时候,往往教程里是这么写的: Intent intent = new Intent(); //MyActivity就是当前的Activity,It ...

  8. CodeIgniter框架入门教程——第一课 Hello World!

    本文转载自:http://www.softeng.cn/?p=45 今天开始,我将在这里连载由我自己编写的<CodeIgniter框架入门教程>,首先,这篇教程的读着应该是有PHP基础的编 ...

  9. ruby代码重构第一课

    (文章是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 新手写代码的时候往往会出现很多重复的代码没有提取出来,大师高瞻远瞩总能提点很多有意义的改进,今天重 ...

随机推荐

  1. SQL Server 将数据导出为XML和Json

    有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做,而SQ ...

  2. Codeforces Round #580 (Div. 1) A-E

    Contest Page A Tag:构造 将$a_i$看做一个无穷数列,$i > 2n$时$a_i = a_{i - 2n}$.设$sgn_i = \sum\limits_{j=i+1}^{i ...

  3. oracle基础知识语法大全

    ORACLE支持五种类型的完整性约束NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值.CHECK (检查)--检查在约束中 ...

  4. MVC学习笔记(三)—用EF向数据库中添加数据

    1.在EFDemo文件夹中添加Controllers文件夹(用的是上一篇MVC学习笔记(二)—用EF创建数据库中的项目) 2.在Controllers文件夹下添加一个空的控制器(StudentsCon ...

  5. Thymeleaf前后端分页查询

    分页查询是一个很常见的功能,对于分页也有很多封装好的轮子供我们使用. 比如使用mybatis做后端分页可以用Pagehelper这个插件,如果使用SpringDataJPA更方便,直接就内置的分页查询 ...

  6. python入门基础思维导图

  7. CSS-盒模型与文本溢出笔记

    注意点: 文本居中: text-align:center:文本左右居中 line-heigh:30px;  等于容器高度时,单行文本上下居中 margin:0 auto: 浏览器居中 清除margin ...

  8. 交换ESCHAUNGE英语ESCHAUNGE交易所

    exchange From Middle English eschaunge, borrowed from Anglo-Norman eschaunge exchange 1.An act of ex ...

  9. C# EF框架 频繁连接性能损耗

    目的 测试EF框架在一次连接中多次保存和多次连接的耗时对比 测试环境 数据库SqlServer 2012 R2 EF框架6.2.0版本 数据库内容 ID UserName Password Creat ...

  10. 【DATAGUARD】物理dg配置客户端无缝切换 (八.1)--Data Guard Broker 的配置

    [DATAGUARD]物理dg配置客户端无缝切换 (八.1)--Data Guard Broker 的配置 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读 各位技 ...