using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication46
{
class TwoWaySignaling
{
//事件等待句柄
static EventWaitHandle _ready = new AutoResetEvent(false);
static EventWaitHandle _go = new AutoResetEvent(false);
static readonly object _locker = new object();
static string _message;
static void Main()
{
new Thread(Work).Start();
// 首先等待工作线程就绪
//(一直的连续的_go.set,会使得work里的_go.waitone来不及处理致使信号被淹没,为了使得信号不被淹没,
每次go发信号前必须用另一个信号_ready在work中发射(通过设置_ready.set()),主线程则只有等待到_ready的发射信号后才能使用go反射信号
_ready.WaitOne();//当接收到信号后才能往下执行代码
lock (_locker) _message = "ooo";
_go.Set(); // 通知工作线程执行
_ready.WaitOne();
lock (_locker) _message = "ahhh"; // 给工作线程其它信息
_go.Set();
_ready.WaitOne();
lock (_locker) _message = null; // 发信号通知工作线程退出
_go.Set();
Console.ReadKey();
}
static void Work()
{
while (true)
{
//这里ready发射信号,让主线程阻塞,等待主线程接收到ready的发射信号后(_ready.waitone等待会阻塞)
go再发射信号,否则go的信号会因为来不及处理而被淹没,之后在主线程的_ready调用_ready_waitone等待阻塞结束后,才让_go调用_go.set()继续发射信号,使得工作线程work更新控制台的输出)
_ready.Set(); // 表示我们准备好了
_go.WaitOne(); // 等待开始 .set()是发射信号,.WaitOne()则是等待信号
lock (_locker)
{
if (_message == null) return; // 优雅地退出
Console.WriteLine(_message);
}
}
}
}
}
Linux进程线程学习笔记:运行新程序
Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...
C#线程学习笔记九:async &; await入门二
一.异步方法返回类型 只能返回3种类型(void.Task和Task). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...
C#线程学习笔记五:线程同步--事件构造
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Event_Constructor.html,记录一下学习过程以备后续查用. 前面讲的线 ...
C#线程学习笔记六:线程同步--信号量和互斥体
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Mutex_And_Semaphore.html,记录一下学习过程以备后续查用. ...
C#线程学习笔记四:线程同步
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/21/ThreadsSynchronous.html,记录一下学习过程以备后续查用. ...
C#线程学习笔记三:线程池中的I/O线程
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/20/MultiThreads.html,记录一下学习过程以备后续查用. 一.I/O线 ...
C#线程学习笔记二:线程池中的工作者线程
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/ThreadPool.html,记录一下学习过程以备后续查用. 一.线程池基础 首先,创 ...
C#线程学习笔记一:线程基础
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,记录一下学习过程以备后续查用. 一.线程的介绍 进程(Proce ...
C#线程学习笔记
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,记录一下学习,方便后面资料查找 一.线程的介绍 进程(Proce ...
随机推荐
vim编辑器详解
vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率. vi是“visual interface”的 ...
「2014-4-13」Think twice before starting the adventure
杂文一篇. 1. 取名字真心是一件特别困难的事情.这位独立开发者花了将近两天的时间,给他的私人项目取了个名字:这篇博客里显然还忽视了一个原因,就是名字取得太烂以至 ...
mysql控制流程函数
1.case语句 select case 2 when 1 then '男' when 2 then '女' else 'xoap' end as result; 2.if语句 select if(1 ...
The Lost Art of C Structure Packing
对齐要求 首先需要了解的是,对于现代处理器,C编译器在内存中放置基本C数据类型的方式受到约束,以令内存的访问速度更快. 在x86或ARM处理器中,基本C数据类型通常并不存储于内存中的随机字节地址.实际 ...
深度学习工具caffe具体安装指南
caffe安装指南-吐血整理 前言: 在一台系统环境较好的linux机器上能够非常easy的安装caffe,可是假设系统本身非常旧,又没有GPU的话.安装就太麻烦了,全部都得从头做起,本文档旨在尽可能 ...
drools6 基本使用 -- 2
续drools6 基本使用1 http://blog.csdn.net/cloud_ll/article/details/26979355 8. 创建src/main/test folder.把dro ...
onS 记录
1.用户的解锁 用户因多次登录失败而被锁的情况下,可用faillog命令来解锁.具体如下 ...
hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
angular使用Md5加密
一.现象 用户登录时需要记住密码的功能,在前端需要对密码进行加密处理,增加安全性 二解决 1.利用npm(如果没有,先自行安装npm)安装ts-md5 npm install ts-md5 --sav ...
day053 url反向解析图解 模板渲染
一.语法 两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二.变量 1. 可直接用 {{ 变量名 }} (可调用字符串, 数字 ,列表,字典,对象等) ...