EventWaitHandle 第一课
本篇通过一个列子使用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 第一课的更多相关文章
- vue.js学习(第一课)
学习资料 来自台湾小凡! vue.js是javascript的一个库,只专注于UI层面,核心价值永远是 API的简洁. 第一课: 不支持IE8. 1.声明式渲染: el元素的简称 element : ...
- Magento学习第一课——目录结构介绍
Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...
- <-0基础学python.第一课->
初衷:我电脑里面的歌曲很久没换了,我想听一下新的歌曲,把他们下载下来听,比如某个榜单的,但是一首一首的点击下载另存为真的很恶心 所以我想有没有办法通过程序的方式来实现,结果还真的有,而且网上已经有有人 ...
- 留念 C语言第一课简单的计算器制作
留念 C语言第一课简单的计算器制作 学C语言这么久了. /* 留念 C语言第一课简单的计算器制作 */ #include<stdio.h> #include<stdlib.h ...
- MFC学习-第一课 MFC运行机制
最近由于兴趣爱好,学习了孙鑫的MFC教程的第一课.看完视频了,自己便用visual studio 2010尝试了MFC编程,其中遇到了一些问题. 1.vs2010不像vs6.0那样可以新建一个空的MF ...
- OpenCV 第一课(安装与配置)
OpenCV 第一课(安装与配置) win10,opencv-2.4.13, 安装, vs2013, 配置 下载安装软件 官网OpenCV下载地址下载最新版本,我下载的是opencv.2.4.13,然 ...
- 【第一课】神奇的Context
初学Android的困惑 初学Android跳转页面的时候,往往教程里是这么写的: Intent intent = new Intent(); //MyActivity就是当前的Activity,It ...
- CodeIgniter框架入门教程——第一课 Hello World!
本文转载自:http://www.softeng.cn/?p=45 今天开始,我将在这里连载由我自己编写的<CodeIgniter框架入门教程>,首先,这篇教程的读着应该是有PHP基础的编 ...
- ruby代码重构第一课
(文章是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 新手写代码的时候往往会出现很多重复的代码没有提取出来,大师高瞻远瞩总能提点很多有意义的改进,今天重 ...
随机推荐
- PHP 去一定范围随机小数 随机浮点数
例如取2到3中的 随机小数(一位)或整数 mt_rand(20,30)/10 mt_rand()是随机取整函数 先扩大一定倍数,再缩小相应倍数,倍数代表精确到哪一位
- Java字节码扩展
异常表 代码一: public class Test03 { public void test() { try { InputStream is = new FileInputStream(" ...
- JS基础理论相关知识
1.XHTML和HTML有什么区别 HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同:XHTML 元素必须被正确地嵌套.XHTML 元素必须被关闭.标签名必须用 ...
- 十二、vue中watch原理
1.普通的watch 2.对象属性的watch: 对象和数组都是引用类型,引用类型变量存的是地址,地址没有变,所以不会触发watch.这时我们需要进行深度监听,就需要加上一个属性 deep,值为 ...
- watch from Middle English wacche
watch As a noun, from Middle English wacche, Etymology As a noun, from Middle English wacche,See bel ...
- 基于 k8s-搭建 Kubernetes 的 web 管理界面
查看我们的k8s环境是否正常: 使用kubectl get nodes 获取我们的节点的信息: 到此说明我们的kubernetes环境是正常的,接下来就可以实验了 第一步在master上传所需的软件包 ...
- Objective-C中的@dynamic 、@synthesize
Objective-C中的@dynamic 一.@dynamic与@synthesize的区别 @property有两个对应的词,一个是@synthesize,一个是@dynamic.如果@synth ...
- glfw之hello world
mac上用cocoa做imshow,资料似乎不好找,即便找到也需要和OC混编,而不是纯C.这不够纯粹.考虑用opengl做通用的.跨平台的imshow.先入门一下opengl,从glfw官方例子入手. ...
- [CAN].CAN总线详解
转自:https://blog.csdn.net/cheatscat/article/details/82886889 CAN(Controller Area Network)总线协议是由 BOSCH ...
- RS232、RS485和TTL电平与串行通信
RS232.RS485和TTL 作为一个底层软件开发工程师,经常会碰到RS232.RS485和TTL这一类的问题. 之前总是碰到问题之后Google一下,把当下的问题解决了之后就不管了,过个一两天就忘 ...