线程同步之ManualResetEvent类的用法
笔者的一台激光测厚设备的软件, 它有一个运动线程, 一个激光数据处理线程.
运动线程做的事就是由A点移动到B点, 然后再由B点移动回A点.
激光处理线程要做的事就是采集指定数量点的激光数据, 随着采集的点数增加, 耗时也会增加.
这两个线程就存在线程同步的问题, 预想的标准流程应该是这样的:
- A点到B点运动开始一瞬间, 通知激光线程开始采集数据
- 激光线程采集数据完成后, 通知运动线程继续, 这时运动线程决定当前是由A到B, 还是由B到A
- 循环执行上述的动作.
这样的线程同步要求, 可以使用C#的一个封装windows内核信号量的类ManualResetEvent来实现, 它是笔者用得最多的一个类. 所以在这里重点记录下来.
ManualResetEvent的功能我们先做一个简要说明:
ManualResetEvent可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源
当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。
可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
看理论要结合代码验证, 这样更容易明白.
下面给出演示代码. (它并非是我开篇所述项目的例子, 只是一个更简单的示例.)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace ManualResetEventState
{
class Program
{
static ManualResetEvent _mre = new ManualResetEvent(false);
static void Main(string[] args)
{
Console.WriteLine("输入1为Set() 开始运行");
Console.WriteLine("输入2为Reset() 暂停运行");
Thread[] _threads = new Thread[]; for (int i = ; i < _threads.Count(); i++)
{
_threads[i] = new Thread(ThreadRun);
_threads[i].Start();
} while (true)
{
switch (Console.ReadLine())
{
case "":
_mre.Set();
Console.WriteLine("开始运行");
break;
case "":
_mre.Reset();
Console.WriteLine("暂停运行");
break;
default:
break;
}
}
} static void ThreadRun()
{
int _threadID = ;
while (true)
{
_mre.WaitOne();
_threadID = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("current Tread is " + _threadID);
Thread.Sleep(TimeSpan.FromSeconds()); }
}
}
}
运行结果如下图:

原创文章,出处 : http://www.cnblogs.com/hackpig/
线程同步之ManualResetEvent类的用法的更多相关文章
- 多线程状态与优先级、线程同步与Monitor类、死锁
一.线程状态 二.线程优先级 三.初步尝试多线程 class Program { static void Main(string[] args) { while (true) { MessagePri ...
- 多线程,线程同步,synchronized关键字的用法
一.什么是多线程 Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorSe ...
- 线程同步工具 Semaphore类使用案例
参考博文 : 线程同步工具(一) 线程同步工具(二)控制并发访问多个资源 并发工具类(三)控制并发线程数的Semaphore 使用Semaphore模拟互斥锁 当一个线程想要访问某个共享资源,首先,它 ...
- 线程同步工具 Semaphore类的基础使用
推荐好文: 线程同步工具(一) 线程同步工具(二)控制并发访问多个资源 并发工具类(三)控制并发线程数的Semaphore 简介 Semaphore是基于计数的信号量,可以用来控制同时访问特定资源的线 ...
- java线程同步 以及wait 和notify用法
package test; public class ThreadTest2 extends Thread { private int threadNo; private String lock; p ...
- JUC——线程同步辅助工具类(Semaphore,CountDownLatch,CyclicBarrier)
锁的机制从整体的运行转态来讲核心就是:阻塞,解除阻塞,但是如果仅仅是这点功能,那么JUC并不能称为一个优秀的线程开发框架,然而是因为在juc里面提供了大量方便的同步工具辅助类. Semaphore信号 ...
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- 线程同步-使用ReaderWriterLockSlim类
使用ReaderWriterLockSlim创建一个线程安全的机制,在多线程中对一个集合进行读写操作.ReaderWriterLockSlim代表了一个管理资源访问的锁,允许多个线程同时读取,以及独占 ...
- 线程同步-使用SimaphoreSlim类
SimaphoreSlim类是作为Semaphore类的轻量级版本的.该类限制了同时访问同一个资源的线程数量. 代码Demo: using System;using System.Threading; ...
随机推荐
- oracle 11g RAC 在Windows 7下安装
oracle 11g RAC 在Windows 7下安装 完全要参考RAC11gR2OnWindows.pdf 难点总是在Grid Infrastructure 而安装Grid Infrastruct ...
- Dockerfile 常用指令
下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档. FROM指定 base 镜像. MAINTAINER设置镜像的作者,可以是任意字符串. COPY将文件从 build ...
- 安装PHP5 PHP7
安装 PHP5 PHP官网www.php.net • 当前主流版本为5./7.1 • cd /usr/local/src/ • wget http://cn2.php.net/distribution ...
- 两台linux服务器之间实现挂载
https://blog.csdn.net/lpp_dd/article/details/78743862 两台linux服务器之间实现挂载: 服务端: 1.首先需要在主机上设置允许挂载的目录 (1) ...
- Activity优化几个结束的方法
package com.itau.jingdong; import java.util.Stack; import android.app.Activity; import android.app.A ...
- CocoaPods 第三方库管理器
下载地址:https://github.com/kattrali/cocoapods-xcode-plugin 跟 VVDocumenter 规范注释生成器的安装方式一样: 下载开源工程在 Xcode ...
- 安全检测:2013 Top 10 List
转自:https://www.owasp.org/index.php/Top_10_2013-Top_10 Risk 2013 Table of Contents 2013 Top 10 List ...
- java 实现类似于python requests包的Session类,自动管理cookie。
1.在py中requests.post()和get()函数都是在那个函数内部里面自动生成了一个Session类的实例,所以requests,post和get函数要想干登陆后才能干的事情,需要添加coo ...
- 多线程二(GCD)代码笔记
// // TWFXViewController.h // Demo_GCD // // Created by Lion User on 12-12-11. // Copyright (c) 2012 ...
- iOS_UITextField 基本操作
基本操作 UITextField *userNameTextField = [[UITextField alloc] init]; userNameTextField.frame = CGRectMa ...