AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方
下边有个 循环调用线程写奇偶数的程序
class TheadTest
{
//定义一个Stream对象接收打开文件
private FileStream st;
//构造方法
public TheadTest()
{
}
public void Start()
{
//定义两个信号锁
AutoResetEvent ateA = new AutoResetEvent(false);
AutoResetEvent ateB = new AutoResetEvent(false);
//把信号锁加入到List中
List<AutoResetEvent> lst = new List<AutoResetEvent>();
lst.Add(ateA);
lst.Add(ateB); //定义带参数的输出偶数线程
Thread thrEven = new Thread(new ParameterizedThreadStart(OutPutEven));
thrEven.Name = "偶数线程";
//把两个信号锁传入线程
thrEven.Start(lst); //定义带参数的输出奇数线程
Thread thrOdd = new Thread(new ParameterizedThreadStart(OutPutOdd));
thrOdd.Name = "极数线程";
thrOdd.Start(lst);
} private void OutPutEven(object lst)
{
AutoResetEvent ateA = (lst as List<AutoResetEvent>)[0];
AutoResetEvent ateB = (lst as List<AutoResetEvent>)[1]; for (int i = 0; i < 100; i += 2)
{
//设置本线程为无信号
ateA.WaitOne();
//输出
Console.WriteLine(i);
//st = File.Open(@"C:/file.txt", FileMode.Open); //用来测试同时访问文件系统的
//st.Close();
ateB.Set(); //设置输出奇数线程有信号
//Thread.Sleep(500);
}
}
private void OutPutOdd(object lst)
{
AutoResetEvent ateA = (lst as List<AutoResetEvent>)[0];
AutoResetEvent ateB = (lst as List<AutoResetEvent>)[1];
//设置偶数线程先输出
ateA.Set();
for (int i = 1; i < 100; i += 2)
{
//设置本线程为无信号
ateB.WaitOne();
Console.WriteLine(10000);
//st = File.Open(@"C:/file.txt", FileMode.Open); //用来测试同时访问文件系统的
//st.Close();
ateA.Set(); //设置输出偶数线程有信号
//Thread.Sleep(500);
}
}
}

此时两个线程执行方法都在循环中没问题 ,程序是交互进行的,ateA 先执行,然后waitone ,等待ateB执行完发送set信号。
把其中一个循环去掉,
// for (int i = 1; i < 100; i += 2)
// {
//设置本线程为无信号
ateB.WaitOne();
Console.WriteLine(10000);
//st = File.Open(@"C:/file.txt", FileMode.Open); //用来测试同时访问文件系统的
//st.Close();
ateA.Set(); //设置输出偶数线程有信号
//Thread.Sleep(500);
// }
运行结果:

就运行了三行拉倒了,而且是
ateA 运行了两次,
ateB运行了一次。 没有循环只运行了一次,线程就结束了。
ateA 的循环即使发送
ateB.set()信号也没用了,线程已经关闭了,运行一次就关闭了,当然应该考虑到线程启动关闭的运行效率,应该就是这么个规矩,线程启动要执行哪个程序,执行完毕,
、线程自动退出。实际运行中,这里有些理解上挺不爽的,不知道别人怎么样。
从理解的角度上讲,线程应该一直在那启动着,给予set信号,线程执行程序开始运行,执行完后等待下次set信号,而不应该退出。
所以要想用上这个知识点在程序中,还需要改进不少。这个问题上次处理上位机时碰到,当时已经知道这个问题,今天因为上边的写法中,参数和加了一个循环,
导致自己出现错觉了,以为这种写法就可以给信号执行,没信号不执行,执行完之后线程挂起而不是退出的功能
AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方的更多相关文章
- 死锁、Lock锁、等待唤醒机制、线程组、线程池、定时器、单例设计模式_DAY24
1:线程(理解) (1)死锁 概念: 同步中,多个线程使用多把锁之间存在等待的现象. 原因分析: a.线程1将锁1锁住,线程2将锁2锁住,而线程1要继续执行锁2中的代码,线程2要继续执行锁1中的代码, ...
- 并发编程: GIL锁、GIL与互斥锁区别、进程池与线程池的区别
一.GIL 二.关于GIL性能的讨论 三.计算密集测试 四.IO密集测试 五.GIL与互斥锁 六.TCP客户端 七.进程池 八.进程什么时候算是空闲 九.线程池 一.GIL GIL Global In ...
- quartz源码分析——执行引擎和线程模型
title: quartz源码分析--执行引擎和线程模型 date: 2017-09-09 23:14:48 categories: quartz tags: [quartz, 源码分析] --- - ...
- Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行
Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行 Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执 ...
- CPU的最小执行单位是线程,协程不需要qt支持...直接用现成的协程库就行了
协程也就在I/O操作上才有优势,Qt事件循环,本事很多I/O已经是异步了,利用好异步(虽然都说异步有点反人类思维).因为CPU的执行最小单位是线程,协程也只是在其之上又调度而已. 我的意思是利用好异步 ...
- 7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)
/* * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信) * */ public class TestProductorAndConsumerForLoc ...
- C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗
结论: 能, 执行完的线程调用Join不会抛出错误. Thread.Join()是什么? Join()函数用于阻塞地等待线程结束, 其行为是在线程A中调用了线程B的Join()后, 线程A将一直阻塞在 ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
- c#中Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程 ...
随机推荐
- emacs使用 simple-httpd和impatient-mode插件实现livereload
现在用emacs写前段,自然想实现那种,编辑器里编辑,然后浏览器端页面自己刷新 使用 simple-httpd 和impatient-mode 两个插件,可以实现, 按照文档安装好使用就可以,我没找到 ...
- C预处理和C库
#include <stdio.h> #define MAN(x) "n"##x int main(void) { printf("%s",MAN( ...
- XE6移动开发环境搭建之IOS篇(3):配置虚拟机,设置Mac安装环境(有图有真相)
网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.创建新的虚拟机 ...
- finder的隐藏文件&IOS虚拟机地址
在终端里输入下面命令即可让它们显示出来. defaults write com.apple.finder AppleShowAllFiles -bool true 如果想恢复隐藏,可以用这个命令: ...
- 防止SQL注入攻击的一些方法小结
SQL注入攻击的危害性很大.在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理.这有利于管理员采取有针对性的防治措施. 一. SQL注入攻击的简单示例. statement := &quo ...
- ES6中的Class
对于javascript来说,类是一种可选(而不是必须)的设计模式,而且在JavaScript这样的[[Prototype]] 语言中实现类是很蹩脚的. 这种蹩脚的感觉不只是来源于语法,虽然语法是很重 ...
- 自动化脚本过程中出现This element neither has attached source nor attached Javadoc...的解决方法
This element neither has attached source nor attached Javadoc and hence no Javadoc could be found Ec ...
- Flask——route
Flask——route 关于路由flask中有三种方法(例子)处理: flask.Flask.route 装饰器(关于装饰器可以参考该文),这时最常见的使用方法,在装饰器的参数中加入想要的路由即可, ...
- leetcode 169
169. Majority Element Given an array of size n, find the majority element. The majority element is t ...
- js 淡入淡出的图片
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...