线程之间灵活传递信号(ManualResetEventSlim )

当主程序启动时,首先创建ManualResetEventSlim 类的一个实例。然后启动三个线程,等待事件信号通知它们继续执行。

 1 /// <summary>
 2         /// 创建 ManualResetEventSlim 实例
 3         /// </summary>
 4         private static ManualResetEventSlim _mainEvent = new ManualResetEventSlim(false);
 5
 6         /// <summary>
 7         /// 接收信号继续执行
 8         /// </summary>
 9         /// <param name="threadName">线程名</param>
10         /// <param name="secods">时间(秒)</param>
11         public void TravelThroughGates(string threadName, int secods)
12         {
13             // threadName  falls to sleep
14             System.Threading.Thread.Sleep(TimeSpan.FromSeconds(secods));
15
16             // threadName waits for the gates to open
17             _mainEvent.Wait();      // 阻止当前线程,直到接收到信号
18
19             // threadName enters the gates
20             Console.WriteLine($"{threadName} 继续执行");
21
22         }

线程只有在ManualResetEventSlim 对象发出信号才能继续执行,不然只有继续等待,直到接接收到信号。

 1 /// <summary>
 2         /// 输出
 3         /// </summary>
 4         public void Print()
 5         {
 6             var t1 = new System.Threading.Thread(() => TravelThroughGates("Thread 1", 5));
 7             var t2 = new System.Threading.Thread(() => TravelThroughGates("Thread 2", 6));
 8             var t3 = new System.Threading.Thread(() => TravelThroughGates("Thread 3", 12));
 9
10             t1.Start();
11             t2.Start();
12             t3.Start();
13             System.Threading.Thread.Sleep(TimeSpan.FromSeconds(6));
14
15             // The gates are now open
16             _mainEvent.Set();   // 发射信号
17
18             System.Threading.Thread.Sleep(TimeSpan.FromSeconds(2));
19             _mainEvent.Reset();     // 关闭信号
20
21             // The gates have been closed
22             System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10));
23
24             // The gates are now open for the second time
25             _mainEvent.Set();   // 发射信号
26
27             System.Threading.Thread.Sleep(TimeSpan.FromSeconds(2));
28
29             //The gates have been closed
30             _mainEvent.Reset();     // 关闭信号
31         }

原文地址:https://www.cnblogs.com/KevinTong/p/11462595.html

时间: 2024-10-14 15:57:06

线程之间灵活传递信号(ManualResetEventSlim )的相关文章

Qt C++控件提升,微件之间定义传递信号和槽案例

Widget  ----微件,Android编程里面常见的控件组织形式 新建一项目,步骤如下:   在ui设计界面中添加了一个Widget控件:图片中选中处 自定义一个微件,这里我命名为smallwidget,在构造函数实现中,定义一个旋转数码盒(Qt中的spinbox),一个滑动条. #include "smallwidget.h" #include <QSpinBox> #include <QSlider> #include <QHBoxLayout&

详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

ThreadLocal父子线程之间的数据传递问题

一.问题的提出 在系统开发过程中常使用ThreadLocal进行传递日志的RequestId,由此来获取整条请求链路.然而当线程中开启了其他的线程,此时ThreadLocal里面的数据将会出现无法获取/读取错乱,甚至还可能会存在内存泄漏等问题,下面用代码来演示一下这个问题. 普通代码示例: 并行流代码示例: 二.问题的解决 ThreadLocal的子类InheritableThreadLocal其实已经帮我们处理好了,通过这个组件可以实现父子线程之间的数据传递,在子线程中能够父线程中的Threa

jmeter中线程之间传递参数

JMeter 变量作用域局限于所属线程.这样设计是经过深思熟虑的,目的是让测试线程能够独立运转.有时候用户可能需要在不同线程间(可能属于同一个线程组,也可能不属于同一个线程组)传递变量. 其中一种方法就是使用属性.属性为所有 JMeter 线程所共享,因此当某个线程设置一个属性后,其他线程就可以读取更新后的值. 如果存在大量数据需要在线程间传递,那么可以考虑使用文件.例如,测试人员可以在一个线程中使用监听器,保存响应到文件(Save Responses to a file )或者 BeanShe

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

线程之间的通讯问题

1.线程间的通信方式 使用全局变量主要由于多个线程可能更改全局变量,因此全局变量最好声明为violate 使用消息实现通信在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信sendMessage,postMessage. 1)定义消息#define WM_THREAD_SENDMSG=WM_USER+20; 2)添加消息函数声明afx_msg int OnTSendmsg(); 3)添

Linux系统进程的知识总结,进程与线程之间的纠葛...

来源:嵌入式ARM 当一个程序开始执行后,在开始执行到执行完毕退出这段时间内,它在内存中的部分就叫称作一个进程. Linux 是一个多任务的操作系统,也就是说,在同一时间内,可以有多个进程同时执行.我们大家常用的单CPU计算机实际上在一个时间片段内只能执行一条指令.那么Linux是如何实现多进程的同时执行的呢?原来Linux使用了一种称为” 进程调度 “的手段,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多的进程中挑选一个投入运行,其他进程暂时等

[转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...

Linux系统进程的知识总结,进程与线程之间的纠葛... https://cloud.tencent.com/developer/article/1500509 当一个程序开始执行后,在开始执行到执行完毕退出这段时间内,它在内存中的部分就叫称作一个进程. Linux 是一个多任务的操作系统,也就是说,在同一时间内,可以有多个进程同时执行.我们大家常用的单CPU计算机实际上在一个时间片段内只能执行一条指令.那么Linux是如何实现多进程的同时执行的呢?原来Linux使用了一种称为” 进程调度 “的

线程之间的通信

1.1.线程之间的通信方法 多个线程在处理统一资源,但是任务却不同,这时候就需要线程间通信.    等待/唤醒机制涉及的方法:    1. wait():让线程处于冻结状态,被wait的线程会被存储到线程池中.    2. notify():唤醒线程池中的一个线程(任何一个都有可能).    3. notifyAll():唤醒线程池中的所有线程.  备注    1.这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法.    2.必须要明确到底操作的是哪个锁上的线程!    3.wa